GET
H2
|
200
|
Primary Request
/
Show response
www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
|
139 KB
55 KB
|
106ms
90ms
|
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
|
9ms
8ms
|
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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
|
9ms
9ms
|
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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
|
9ms
9ms
|
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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
|
metaTag.min.9ca6297f6e6a5371abc434e6eb433c07.js
Show response
js.stroeermediabrands.de/
|
242 KB
59 KB
|
39ms
12ms
|
Script
application/javascript |
46.253.113.178
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
lux.js
Show response
cdn.speedcurve.com/js/
|
19 KB
7 KB
|
39ms
6ms
|
Script
application/javascript |
151.101.14.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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.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-298466378d.js
Show response
www.giga.de/static-local/dist/assets/js/
|
33 KB
11 KB
|
8ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
main-desktop-00600edd16.css
www.giga.de/static-local/dist/assets/css/
|
401 KB
53 KB
|
12ms
12ms
|
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
|
37ms
13ms
|
Script
application/javascript |
91.215.103.64
INFONLINE-AS
|
|
|
GET
H/1.1
|
200
OK
|
trackcp.js
Show response
gocp.stroeermediabrands.de/
|
28 KB
11 KB
|
21ms
2ms
|
Script
application/javascript |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
martin-maciej-rcm40x40.jpg
static.giga.de/wp-content/uploads/2013/04/
|
1 KB
2 KB
|
25ms
8ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2013/04/martin-maciej-rcm40x40.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
- 505b170e929bca71e7fec8a2bff588459b60e1e9bc99e6f68443d29b3cd73335
- 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/
|
103 KB
37 KB
|
21ms
19ms
|
Script
text/javascript |
2a00:1450:4001:814::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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 6f128586b7017fd051b211b07fa7ed4ef775c82ba9a715a05995b579737e79f6
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
Stream-Hoster-rcm992x0.jpg
static.giga.de/wp-content/uploads/2018/03/
|
33 KB
34 KB
|
30ms
13ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2018/03/Stream-Hoster-rcm992x0.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
- 72855c173e195a3e74f1f7e4587bb29f51a762fa9b9e0fbbf6d80e420957a8ca
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
giga.svg
www.giga.de/static-local/dist/assets/images/logos/
|
11 KB
4 KB
|
10ms
8ms
|
Image
image/svg+xml |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
-
https://ssl-econa.met.vgwort.de/na/828af7bc47ba49af9820d7735fbb8942
-
https://ssl-econa.met.vgwort.de/blank.gif
|
43 B
310 B
|
6ms
6ms
|
Image
image/gif |
161.156.66.178
SoftLayer Technol...
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
251 B
|
7ms
6ms
|
Image
image/gif |
2a03:2880:f11c:8183:face:b00c:0:25de
Facebook
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
206 B
|
8ms
7ms
|
Image
image/gif |
2a03:2880:f11c:8183:face:b00c:0:25de
Facebook
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
43 KB
17 KB
|
7ms
6ms
|
Script
text/javascript |
2a00:1450:4001:808::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-298466378d.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:808::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/
|
88 KB
26 KB
|
23ms
7ms
|
Script
application/javascript |
13.224.199.29
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
api
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://cdn.m6r.eu/sync/api
-
https://tracking.m6r.eu/sync/api?checkcookies=true
|
1 KB
1 KB
|
34ms
18ms
|
Script
application/javascript |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
identitystatus
Show response
irqs.ioam.de/
|
25 B
203 B
|
33ms
10ms
|
XHR
application/vnd.api+json |
193.46.63.75
INFONLINE-AS
|
|
General
- Full URL
- https://irqs.ioam.de/identitystatus?offerIdentifier=giga&siteIdentifier=film_content&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.20377467485280265
- 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
|
tx.io
Show response
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=giga&cp=film_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000e&i2=000e51aa00fcb3a495de65bfc&ep=1603947532&vr=415&id=sx...
-
https://de.ioam.de/tx.io?st=giga&cp=film_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000e&i2=000e51aa00fcb3a495de65bfc&ep=1603947532&vr=415&id=sx...
|
0
694 B
|
12ms
12ms
|
Script
application/x-javascript |
91.215.103.65
INFONLINE-AS
|
|
General
- Full URL
- https://de.ioam.de/tx.io?st=giga&cp=film_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000e&i2=000e51aa00fcb3a495de65bfc&ep=1603947532&vr=415&id=sxnjyl&i3=000e51aa00fcb3a495de65bfc%3A1601557116932%3A1575377916932%3A.giga.de%3A1%3Agiga%3Afilm_content%3Anoevent%3A1575377916932&n1=3&dntt=0<=1575377916934&ev=&cs=a29um2&mo=1&sr=71
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
91.215.103.65
, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- de3.ioam.de
- Software
-
nginx /
BLACKBIRD-RCV v1.05.0 0029
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
|
10 KB
10 KB
|
8ms
7ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/fontello/fontello.woff2?53628368
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
- 1c3b2ef5bd8dd65a075f5e2e01b69421c16206237d55d600be9011b1cb29442f
|
GET
H2
|
200
|
lazyload-65c07b80e0.min.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/lazyload/
|
5 KB
2 KB
|
7ms
7ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/js/vendor/lazyload/lazyload-65c07b80e0.min.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
- 69e942532f5c4b64fd68a98c15a62eb5d6fd6cb864282fa9a0c11ead2cdc9268
|
GET
H2
|
200
|
78410589
Show response
videos.giga.de/embed/
Frame 34FB
|
9 KB
3 KB
|
38ms
20ms
|
Document
text/html |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
init
Show response
d.nativendo.de/cds/delivery/
|
991 B
919 B
|
28ms
13ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/r/
|
35 B
104 B
|
13ms
13ms
|
Image
image/gif |
2a00:1450:4001:808::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=935930240&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=4GBAAEAB~&jid=1986592640&gjid=586430150&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&_r=1&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&z=388377977
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:808::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
|
aps_csm.js
Show response
c.amazon-adsystem.com/bao-csm/aps-comm/
|
6 KB
3 KB
|
25ms
11ms
|
XHR
application/javascript |
13.224.199.29
Amazon.com
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
171 B
|
15ms
14ms
|
Script
application/javascript |
2a00:1450:4001:814::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:814::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
|
16ms
16ms
|
Script
application/javascript |
2a00:1450:4001:814::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:814::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_fy2019.js
Show response
pagead2.googlesyndication.com/pagead/js/r20191114/r20190131/
|
220 KB
83 KB
|
27ms
27ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20191114/r20190131/show_ads_impl_fy2019.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- b198f6c8ffd50a477f7dea4911bcbeb614271d080084eb189c30716ef24af5db
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
show_ads_impl_fy2019.js
Show response
pagead2.googlesyndication.com/pagead/js/r20191114/r20190131/
Frame F4AE
|
220 KB
83 KB
|
26ms
26ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20191114/r20190131/show_ads_impl_fy2019.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- b198f6c8ffd50a477f7dea4911bcbeb614271d080084eb189c30716ef24af5db
- 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/r20191114/r20190131/
Frame 5546
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:814::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20191114/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:814::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
|
31ms
6ms
|
Script
text/javascript |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/z.js?0.6509450203912719
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
- df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
Cookie set
iframe
tracking.m6r.eu/pixel/
Frame A193
Redirect Chain
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Film%20%26amp%3B%20Serien
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Film%20%26amp%3B%20Serien&checkcookies=true
|
0
0
|
19ms
19ms
|
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%20Film%20%26amp%3B%20Serien&checkcookies=true
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, 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
|
tfa.js
Show response
cdn.taboola.com/libtrc/unip/1092206/
|
42 KB
14 KB
|
12ms
10ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
|
51 KB
16 KB
|
55ms
41ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
101 B
487 B
|
107ms
107ms
|
XHR
text/javascript |
13.224.199.29
Amazon.com
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&pid=9R8g38aOSJXW7&cb=0&ws=1600x1200&v=7.44.02&t=1000&slots=%5B%7B%22sd%22%3A%220%22%2C%22s%22%3A%5B%22728x90%22%2C%22800x250%22%2C%22970x250%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%221%22%2C%22s%22%3A%5B%22160x600%22%2C%22300x600%22%5D%2C%22sn%22%3A%22sky%22%7D%2C%7B%22sd%22%3A%222%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%7D%5D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.224.199.29
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-13-224-199-29.fra2.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- f4fbbb7746d71d3ed2cf5ba8df40b1f906d988ee88e79c7c4086c40cf373f5c4
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
286 KB
88 KB
|
25ms
7ms
|
Script
application/javascript |
143.204.101.73
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
126 KB
49 KB
|
41ms
13ms
|
Script
text/javascript |
72.247.224.195
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
dmp
Show response
tracking.m6r.eu/sync/
|
97 B
599 B
|
38ms
38ms
|
XHR
application/json |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
nuggad
Show response
nugmw.userreport.com/rc-ap/9aa96ff2-99b7-4539-aafa-f3150345bcab/si.nuggad.net/
Redirect Chain
-
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F
-
https://nugmw.userreport.com/rc-ap/9aa96ff2-99b7-4539-aafa-f3150345bcab/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspeci...
|
2 KB
2 KB
|
66ms
26ms
|
Script
text/javascript |
2600:9000:21f3:3a00:1f:a1b:34c0:93a1
Amazon.com
|
|
General
- Full URL
- https://nugmw.userreport.com/rc-ap/9aa96ff2-99b7-4539-aafa-f3150345bcab/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2600:9000:21f3:3a00:1f:a1b:34c0:93a1
, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- ed030d2e8119198ff49d389fd0f9c4a8547cfc60e8986dcc378b9f389c6f3c1c
|
GET
H2
|
200
|
/
Show response
quiz.stroeermediabrands.de/pub/meta/
|
267 B
637 B
|
40ms
9ms
|
XHR
application/json |
46.253.113.181
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
ad-loading.png
www.dunkirkinception.com/detect/
|
71 B
381 B
|
131ms
60ms
|
Image
image/png |
18.195.39.206
Amazon.com
|
|
|
GET
H2
|
200
|
tag.js
Show response
js.agkn.com/prod/v0/
|
3 KB
3 KB
|
26ms
8ms
|
Script
application/javascript |
2600:9000:2043:fc00:15:efbc:e300:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
gocp.stroeermediabrands.de/absconf/www.giga.de/
|
19 KB
19 KB
|
13ms
7ms
|
Fetch
application/json |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
post-33dedcb970.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
7 KB
3 KB
|
34ms
32ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
giga-772cc0e021.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
31 KB
12 KB
|
34ms
32ms
|
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
33ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/smb-phone-plan-ef34ebe4f8.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
- 2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
|
GET
H2
|
200
|
loader.js
Show response
c.nativendo.de/cdn/asset/js/
|
54 KB
17 KB
|
72ms
20ms
|
Script
application/javascript |
2606:4700:20::681a:4fb
Cloudflare
|
|
|
GET
H2
|
200
|
videojs-c972511a.min.js
Show response
videos.giga.de/dist/js/embed/bundle/
Frame 34FB
|
619 KB
206 KB
|
33ms
33ms
|
Script
application/javascript |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
Frame 34FB
|
273 KB
93 KB
|
49ms
13ms
|
Script
text/javascript |
2a00:1450:4001:816::200a
Google LLC
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 0A18
|
0
0
|
409ms
409ms
|
Document
text/html |
2a00:1450:4001:814::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=6296805359&adk=3471272371&adf=1459277723&w=468&lmt=1575377917&psa=0&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&flash=0&wgl=1&adsid=NT&dt=1575377917054&bpp=18&bdt=178&fdt=201&idt=202&shv=r20191114&cbv=r20190131&saldr=aa&abxe=1&correlator=7178911137210&frm=20&pv=2&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&ga_fc=0&iag=0&icsg=12900237566&dssz=57&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=486&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199337%2C21065126&oid=3&pvsid=2134285338763390&rx=0&eae=0&fc=896&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=1.5zhucv5ko0qe&fsb=1&xpc=AeLv2T8S1U&p=https%3A//www.giga.de&dtd=219
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191114/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::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/
|
78 KB
29 KB
|
51ms
51ms
|
Script
text/javascript |
2a00:1450:4001:814::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/r20191114/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 0e946b0ee0337cf23c845f67a238e1fefd5f1e014fdbd8ea27870172fcedd40f
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
102 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:808::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Quiz%20Teaser%202017&ea=embed&el=013e2a26-c271-4820-86e9-6b7ba44cdfa1&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd20=013e2a26-c271-4820-86e9-6b7ba44cdfa1&cd25=manuell&cd27=SurveyQuestion&cm53=1&z=1541257953
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:808::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
|
videojs-f50f7a8d.css
videos.giga.de/dist/css/
Frame 34FB
|
53 KB
15 KB
|
9ms
8ms
|
Stylesheet
text/css |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
play_button.svg
videos.giga.de/image/
Frame 34FB
|
1015 B
1 KB
|
9ms
9ms
|
Image
image/svg+xml |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
kwiss-69d2e3a105.js
Show response
www.giga.de/static-local/dist/assets/js/components/
|
5 KB
2 KB
|
8ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
article-rating-7143c629e5.js
Show response
www.giga.de/static-local/dist/assets/js/components/
|
306 B
534 B
|
8ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/js/components/article-rating-7143c629e5.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
- 0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
3 KB
2 KB
|
18ms
18ms
|
Script
text/javascript |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
45ms
6ms
|
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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&__id=1575377917307&__it=-60&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
|
ads
googleads.g.doubleclick.net/pagead/
Frame 7FAE
|
0
0
|
16ms
16ms
|
Document
text/html |
2a00:1450:4001:814::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1575377917&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1575377917176&bpp=6&bdt=300&fdt=177&idt=177&shv=r20191114&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=7178911137210&frm=20&pv=1&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&ga_fc=0&iag=0&icsg=825615204344&dssz=61&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199337%2C21065126&oid=3&pvsid=2134285338763390&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=1.uid0w1jjev8t&fsb=1&dtd=182
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191114/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
Cookie set
iu3
aax-eu.amazon-adsystem.com/s/
Frame 9DCE
Redirect Chain
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&dcc=t
|
0
0
|
194ms
193ms
|
Document
text/html |
52.95.123.41
Amazon.com
|
|
General
- Full URL
- https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&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.95.123.41
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
Server /
- Resource Hash
|
GET
H2
|
200
|
loader.js
Show response
cdn.taboola.com/libtrc/stroeer-smb-giga/
|
117 KB
22 KB
|
7ms
7ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
97 B
|
7ms
6ms
|
Image
image/gif |
2a00:1450:4001:808::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Amazon%20Prime%20Video%2030%20Tage%20kostenlos%20testen*&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fs1n5l&cd41=Content%201&cd45=all&cm75=1&z=2018948080
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:808::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
97 B
|
7ms
6ms
|
Image
image/gif |
2a00:1450:4001:808::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=aktuelle%20und%20beliebte%20Serien*&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd39=Text-link&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fs1jyr&cd41=Content%202&cd45=all&cm75=1&z=454972869
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:808::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
97 B
|
8ms
7ms
|
Image
image/gif |
2a00:1450:4001:808::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=aktuelle%20Kinofilme*&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd39=Text-link&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fs1jyu&cd41=Content%203&cd45=all&cm75=1&z=296308767
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:808::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
97 B
|
8ms
7ms
|
Image
image/gif |
2a00:1450:4001:808::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=neue%20Serien*&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd39=Text-link&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fs1jyx&cd41=Content%204&cd45=all&cm75=1&z=1051218020
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:808::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
97 B
|
7ms
7ms
|
Image
image/gif |
2a00:1450:4001:808::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Maxdome%20gratis%20testen*&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2F14ix&cd41=Content%205&cd45=all&cm75=1&z=1427828207
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:808::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
|
dkuim.js
Show response
dkuim.de/api/js/2/
|
465 KB
151 KB
|
49ms
16ms
|
Script
application/javascript |
178.19.65.130
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
kwissc.js
Show response
quiz.stroeermediabrands.de/static/client/
|
227 KB
80 KB
|
26ms
11ms
|
Script
application/javascript |
46.253.113.181
HGCOMP-ASN
|
|
|
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
|
8ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/smb-article-rating-f9506c2d61.min.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
- 8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
|
GET
H2
|
200
|
doT.min.js
Show response
cdnjs.cloudflare.com/ajax/libs/dot/1.0.3/
|
3 KB
2 KB
|
22ms
22ms
|
Script
application/javascript |
2606:4700::6811:4104
Cloudflare
|
|
General
- Full URL
- https://cdnjs.cloudflare.com/ajax/libs/dot/1.0.3/doT.min.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700::6811:4104
, United States,
ASN13335
(CLOUDFLARENET - Cloudflare, Inc., US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- d032695018480726794e6e6eff112f7116a5122bb269d22dc77f3516604a1c1e
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15780000; includeSubDomains |
|
GET
H/1.1
|
200
OK
|
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=c691c1b2ce4aa7b0c77ae005c6c76af2&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Dc691c1b2ce4aa7b0c77ae005c6c76af2%2...
-
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=c691c1b2ce4aa7b0c77ae005c6c76af2&userId=adscale-user:3712213cbba249619cfb11e8ca564c3e
|
44 B
528 B
|
20ms
20ms
|
Image
image/gif |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
pubads_impl_2019111801.js
Show response
securepubads.g.doubleclick.net/gpt/
|
159 KB
58 KB
|
39ms
38ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
POST
H2
|
200
|
session
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
239 B
|
29ms
6ms
|
XHR
text/plain |
18.194.252.229
Amazon.com
|
|
|
GET
H2
|
200
|
arj
Show response
yieldlove-d.openx.net/w/1.0/
|
4 KB
5 KB
|
23ms
22ms
|
XHR
application/json |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-60&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=327e301d-e139-4e46-9215-e5b819ee4be8%2C9b67edc9-facf-4141-a792-aa52841bc134%2C09acc535-0d85-42be-a0bd-df1f1f3f627c&nocache=1575377917460&aus=300x250%7C300x600%2C160x600%2C200x600%2C120x600%2C301x601%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle%2Csky%2Cbanner&auid=539390940%2C540714782%2C540847469&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.167.2 /
- Resource Hash
- aba21d1efe464adb5078f827948c4976fe821709b0a2d9414b6790070eaee37c
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
240 B
2 KB
|
80ms
48ms
|
XHR
application/json |
69.173.144.140
The Rubicon Project
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=750960&size_id=15&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=327e301d-e139-4e46-9215-e5b819ee4be8&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.3693598221536869
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.140
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- ec64597779d754515551af95d0f7f66ddc2aa9004eb5b401acb8d9725c261188
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
241 B
2 KB
|
132ms
99ms
|
XHR
application/json |
69.173.144.140
The Rubicon Project
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=1266838&size_id=9&alt_size_ids=8%2C10%2C126&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=9b67edc9-facf-4141-a792-aa52841bc134&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.8976806582902426
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.140
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- f624a1340df7bd5790c3cc8e9bef71e8e374ca2f165030e9c9f3c5b51548b7c3
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
241 B
2 KB
|
91ms
56ms
|
XHR
application/json |
69.173.144.140
The Rubicon Project
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=1408756&size_id=2&alt_size_ids=55%2C57%2C125&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=09acc535-0d85-42be-a0bd-df1f1f3f627c&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.6323356752412108
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.140
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- 29bdf43229a6b2bba4790837d06a94f32c77a43595fb2268f116ee5d3ea4db39
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
373 B
1 KB
|
60ms
34ms
|
XHR
application/json |
185.33.223.206
AppNexus
|
|
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
1 KB
2 KB
|
78ms
53ms
|
XHR
application/json |
185.33.223.206
AppNexus
|
|
|
POST
H2
|
200
|
bid
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
239 B
|
13ms
7ms
|
XHR
text/plain |
18.194.252.229
Amazon.com
|
|
|
POST
H2
|
200
|
auction
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
239 B
|
10ms
6ms
|
XHR
text/plain |
18.194.252.229
Amazon.com
|
|
|
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:81c::200a
Google LLC
|
|
General
- Full URL
- https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81c::200a
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
submit
lb38.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
13ms
1ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
General
- Full URL
- https://lb38.s400.meetrics.net/bb-mx/submit?/tpmJBPAAA/whFpBo0F0wFz6BvvA33F3uBnpFnhFukElvBl4F0yFhvBspF2lFz0FylFhtFvzEwlFjpFhsFzvBpzF0tBzlFypFluFz0FylFhtFu0EvtBslFnhFstBvkFlyFtpEssFlnFhsFtoEplFytBlyFmhFoyF0tBpoFytBlzFvBEfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSZCBPAAAAAAAAAOAAAAGAAAAAAAZwSZCBBRksFAQtjF9H2ETA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.206
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h213.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb38.s400.meetrics.net/
|
43 B
308 B
|
12ms
1ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
|
GET
H2
|
200
|
nativendo.css
c.nativendo.de/cdn/asset/css/
|
5 KB
1 KB
|
16ms
16ms
|
Stylesheet
text/css |
2606:4700:20::681a:4fb
Cloudflare
|
|
|
GET
H/1.1
|
200
OK
|
nuggad
ih.adscale.de/
|
49 B
486 B
|
48ms
24ms
|
Image
image/gif |
72.247.225.134
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
0
376 B
|
121ms
121ms
|
Script
text/javascript |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=1&n116=0&n104=1&n15=1&n155=1&n106=0&n153=1&n11=1&n120=5&n53=1&n154=1&n125=1&n8=1&n2=2&n137=0&n101=1&n108=1&n54=0&n110=1&n87=1&n149=0&n76=1&n66=1&n60=1&n139=1&n160=0&n107=0&n117=4&n86=0&n147=4&n64=0&n119=6&n22=1&n18=1&n161=1&n126=1&n92=2&n57=1&n77=0&n83=1&n102=0&n105=1&n159=1&n20=1&n80=0&n12=1&n141=0&n157=0&n99=0&n128=1&n118=3&n85=0&n9=3&n23=1&n6=2&n63=0&n138=0&n140=0&n94=2&n111=0&n136=1&n79=1&n93=4&n90=1&n142=0&n7=3&n103=0&n158=0&n124=0&n75=0&n91=1&n46=1&n114=1&n69=0&n10=2&n3=1&n82=1&n84=0&n5=1&n48=1&n109=0&n122=1&n67=1&n115=1&n89=1&n123=2&n17=1&n78=0&n44=1&n81=1&n88=0&n39=1&n156=1&n148=0
- Requested by
- Host: tracking.m6r.eu
URL: https://tracking.m6r.eu/sync/api?checkcookies=true
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, 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
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
/
d.agkn.com/iframe/8613/
Frame 7AB9
|
0
0
|
15ms
15ms
|
Document
text/html |
2600:9000:21f3:5a00:19:fc2c:a140:93a1
Amazon.com
|
|
General
- Full URL
- https://d.agkn.com/iframe/8613/?che=85042940&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%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
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2600:9000:21f3:5a00:19:fc2c:a140:93a1
, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
97 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:808::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=Amazon%20Prime%20Video%2030%20Tage%20kostenlos%20testen*&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fs1n5l&cd41=Content%201&cd45=all&cm76=1&z=1184510388
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:808::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
97 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:808::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=aktuelle%20und%20beliebte%20Serien*&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd39=Text-link&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fs1jyr&cd41=Content%202&cd45=all&cm76=1&z=1476570270
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:808::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
|
impl.20191130-2-RELEASE.js
Show response
cdn.taboola.com/libtrc/
|
419 KB
118 KB
|
6ms
6ms
|
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
|
35ms
22ms
|
Script
application/x-javascript |
23.5.97.37
Akamai Technologies
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
13 KB
5 KB
|
306ms
306ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2134285338763390&correlator=3060650938120698&output=ldjh&impl=fif&adsid=NT&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191203&iu=4444%2Fgiga.de_sd%2Ffilm_artikel&sz=800x450%7C580x500%7C580x360%7C480x360%7C42x31&scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dfilm%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D13%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dc691c1b2ce4aa7b0c77ae005c6c76af2%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-0%252Cn153-1%252Cn11-1%252Cn120-5%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-2%252Cn137-0%252Cn101-1%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn57-1%252Cn77-0%252Cn83-1%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn79-1%252Cn93-4%252Cn90-1%252Cn142-0%252Cn7-3%252Cn103-0%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-2%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-1%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575377917&dt=1575377917659&dlt=1575377916876&idt=763&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2789910476&uci=1&ifi=2&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&dssz=72&icsg=64322502969376&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=625x0&msz=800x450&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.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
- 47c51e501d2b66d6bab72a5e78746c270fc58b0d93fb56fc492afaffbe19cf88
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019111801.js
Show response
securepubads.g.doubleclick.net/gpt/
|
65 KB
25 KB
|
39ms
39ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/
|
0
0
|
6ms
6ms
|
Other
text/html |
2a00:1450:4001:820::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::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
|
63ms
63ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2134285338763390&correlator=3060650938120698&output=ldjh&impl=fif&adsid=NT&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191203&iu=4444%2Fgiga.de_sd%2Ffilm_artikel&sz=1x1&ists=1&scp=as%3Dout_of_page%26adslot%3Dout_of_page%26pc%3D1%26af%3Dtickerad&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dfilm%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D13%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dc691c1b2ce4aa7b0c77ae005c6c76af2%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-0%252Cn153-1%252Cn11-1%252Cn120-5%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-2%252Cn137-0%252Cn101-1%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn57-1%252Cn77-0%252Cn83-1%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn79-1%252Cn93-4%252Cn90-1%252Cn142-0%252Cn7-3%252Cn103-0%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-2%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-1%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575377917&dt=1575377917669&dlt=1575377916876&idt=763&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2872708988&uci=2&ifi=3&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&dssz=73&icsg=64322502969376&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x0&msz=1x1&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.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
- f90124131fbd91439b9215f735fece7a698d64650f9e6ed3b7c7f315ae80e883
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
13 KB
5 KB
|
568ms
567ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2134285338763390&correlator=3060650938120698&output=ldjh&impl=fif&adsid=NT&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191203&iu=4444%2Fgiga.de_sd%2Ffilm_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C1000x150%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A20918.scenario%253Adefault%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cfullb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dfilm%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D13%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dc691c1b2ce4aa7b0c77ae005c6c76af2%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-0%252Cn153-1%252Cn11-1%252Cn120-5%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-2%252Cn137-0%252Cn101-1%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn57-1%252Cn77-0%252Cn83-1%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn79-1%252Cn93-4%252Cn90-1%252Cn142-0%252Cn7-3%252Cn103-0%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-2%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-1%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575377917&dt=1575377917678&dlt=1575377916876&idt=763&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3115525706&uci=3&ifi=4&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&dssz=73&icsg=64322502969376&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.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
- 3ed46201cc86ee90919161ca890da9150ae66e57b74cd9d539cb896d3281dc1c
- 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
|
870ms
869ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2134285338763390&correlator=3060650938120698&output=ldjh&impl=fif&adsid=NT&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191203&iu=4444%2Fgiga.de_sd%2Ffilm_artikel&sz=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A19051.scenario%253Adefault%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%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dfilm%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D13%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dc691c1b2ce4aa7b0c77ae005c6c76af2%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-0%252Cn153-1%252Cn11-1%252Cn120-5%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-2%252Cn137-0%252Cn101-1%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn57-1%252Cn77-0%252Cn83-1%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn79-1%252Cn93-4%252Cn90-1%252Cn142-0%252Cn7-3%252Cn103-0%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-2%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-1%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575377917&dt=1575377917683&dlt=1575377916876&idt=763&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2586579414&uci=4&ifi=5&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&dssz=73&icsg=64322502969376&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.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
- 12af38f7094522f639ce5c48e15ae2a09d215c4c64b4457f7ac5ac391f23da8b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
8 KB
4 KB
|
852ms
850ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2134285338763390&correlator=3060650938120698&output=ldjh&impl=fif&adsid=NT&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191203&iu=4444%2Fgiga.de_sd%2Ffilm_artikel&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A9501.scenario%253Adefault%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%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dfilm%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D13%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dc691c1b2ce4aa7b0c77ae005c6c76af2%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-0%252Cn153-1%252Cn11-1%252Cn120-5%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-2%252Cn137-0%252Cn101-1%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn57-1%252Cn77-0%252Cn83-1%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn79-1%252Cn93-4%252Cn90-1%252Cn142-0%252Cn7-3%252Cn103-0%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-2%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-1%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575377917&dt=1575377917687&dlt=1575377916876&idt=763&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1946589169&uci=5&ifi=6&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&dssz=73&icsg=64322502969376&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.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
- aaf4e5c88ec1e577a13ba8c49f7c556b9b9139f66952624c5bef7159db8d2632
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
013e2a26-c271-4820-86e9-6b7ba44cdfa1
Show response
quiz.stroeermediabrands.de/pub/quizzes/
|
8 KB
2 KB
|
10ms
6ms
|
XHR
application/json |
46.253.113.181
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
bootstrap.min.js
Show response
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
|
36 KB
10 KB
|
10ms
7ms
|
Script
text/javascript |
2001:4de0:ac19::1:b:3a
Highwinds Network...
|
|
|
GET
H/1.1
|
200
OK
|
t.png
gocp.stroeermediabrands.de/
|
98 B
355 B
|
3ms
1ms
|
Image
image/png |
188.40.16.106
HETZNER-AS
|
|
General
- Full URL
- https://gocp.stroeermediabrands.de/t.png?title=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&contentPieceId=4576302&publishDate=2018-03-06T14%3A26%3A28%2B01%3A00&_=1575377917734.-96362983
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
H/1.1
|
200
OK
|
pixel
tracking.m6r.eu/consent/
|
44 B
209 B
|
23ms
22ms
|
Image
image/gif |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
config.js
Show response
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
|
44 KB
11 KB
|
24ms
6ms
|
Script
text/javascript |
151.101.113.194
Fastly
|
|
|
GET
H2
|
200
|
97941c7483a90e80b26599c518_ciA2NTAgMzY1LjYyNQNkNzk0NzMwMDY5MQ==.jpg
quiz-media.stroeermediabrands.de/dd/37/e1/
|
34 KB
35 KB
|
34ms
12ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://quiz-media.stroeermediabrands.de/dd/37/e1/97941c7483a90e80b26599c518_ciA2NTAgMzY1LjYyNQNkNzk0NzMwMDY5MQ==.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
- 51ae405ef31ebea30c1fac7a7645a14a85f62095fdfc06c8c5ce4ea73caade0f
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
78410589
Show response
videos.giga.de/embed/
Frame 34FB
|
9 KB
3 KB
|
35ms
35ms
|
Document
text/html |
109.71.25.30
HGCOMP-ASN
|
|
|
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=1575377917830&ns_c=UTF-8&cv=3.1e&c8=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E...
-
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1575377917830&ns_c=UTF-8&cv=3.1e&c8=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%...
|
0
248 B
|
6ms
6ms
|
Image
text/plain |
23.5.97.37
Akamai Technologies
|
|
General
- Full URL
- https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1575377917830&ns_c=UTF-8&cv=3.1e&c8=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&c7=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&c9=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.5.97.37
, Netherlands,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a23-5-97-37.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
json
Show response
trc.taboola.com/stroeer-smb-giga/trc/3/
|
17 KB
7 KB
|
626ms
625ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=13%3A58%3A37.865<i=deflated&data=%7B%22id%22%3A146%2C%22ii%22%3A%22%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1575377917313%2C%22cv%22%3A%2220191130-2-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%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%3A5275%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%3A4592.125%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.20191130-2-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
- b8e39cd9d9fd668f0fa22bc541e8ba3aa8d58ad5e6c37aa81d671dc47ce280f3
|
GET
H2
|
200
|
/
Show response
d.nativendo.de/cds/delivery/get/
|
3 KB
2 KB
|
20ms
19ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/
Frame 496A
Redirect Chain
-
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjst0B3cRUNHord6206w8tj5okc_gI07DLspo18AF5QpN5iqK1sH3_31dNhrU9wX2psWNiWs2anDfrcmKNH8oSVoz6G9_gkPhTZ1uFo6O5ALgJ7doAQz_UBAonYzDPdXQduR8FN-1I6hTR...
-
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
|
49 B
344 B
|
29ms
6ms
|
Image
image/gif |
2a02:26f0:6c00:2bc::5f76
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/201911261602/
|
30 KB
12 KB
|
16ms
5ms
|
Script
application/javascript |
151.101.113.194
Fastly
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/201911261602/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.113.194
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 8db624e21c35d3f1626601a61acb544d8dc307f820c325f945d4a2b60cb2c2eb
|
GET
H2
|
200
|
videojs-c972511a.min.js
Show response
videos.giga.de/dist/js/embed/bundle/
Frame 34FB
|
619 KB
206 KB
|
10ms
9ms
|
Script
application/javascript |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
Frame 34FB
|
273 KB
93 KB
|
13ms
13ms
|
Script
text/javascript |
2a00:1450:4001:816::200a
Google LLC
|
|
|
GET
H2
|
200
|
videojs-f50f7a8d.css
videos.giga.de/dist/css/
Frame 34FB
|
53 KB
15 KB
|
25ms
24ms
|
Stylesheet
text/css |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
play_button.svg
videos.giga.de/image/
Frame 34FB
|
1015 B
1 KB
|
25ms
25ms
|
Image
image/svg+xml |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
0
Show response
d.nativendo.de/cds/delivery/render/559sgxds/2s8hs/6e134/9apkw/
|
3 KB
1 KB
|
15ms
14ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
0
Show response
d.nativendo.de/cds/delivery/render/559sgxds/182yo/6e8e8/9bny8/
|
3 KB
1 KB
|
14ms
14ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
7c3e7965-e114-4797-9bd0-b069ed4ffcf9.png
c.nativendo.de/cdn/asset/media/crt/56025/8/5/
|
15 KB
15 KB
|
17ms
17ms
|
Image
image/jpeg |
2606:4700:20::681a:4fb
Cloudflare
|
|
|
GET
H2
|
200
|
b635dcd8-9892-4bd9-bb61-ade64839d331.png
c.nativendo.de/cdn/asset/media/crt/55884/8/5/
|
24 KB
24 KB
|
18ms
15ms
|
Image
image/jpeg |
2606:4700:20::681a:4fb
Cloudflare
|
|
|
GET
H2
|
200
|
a63f5aaf-bba0-4469-8581-8b6e3b532918
Show response
t.nativendo.de/cds/tracking/event/
|
0
170 B
|
29ms
15ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
General
- Full URL
- https://t.nativendo.de/cds/tracking/event/a63f5aaf-bba0-4469-8581-8b6e3b532918?noc=559sgxds&aid=182yo&cid=6e8e8&cti=9bny8&imp=6&t=ad%2Fview&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ts=1575377918
- Requested by
- Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
- 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
|
a63f5aaf-bba0-4469-8581-8b6e3b532918
Show response
t.nativendo.de/cds/tracking/event/
|
0
172 B
|
28ms
14ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
General
- Full URL
- https://t.nativendo.de/cds/tracking/event/a63f5aaf-bba0-4469-8581-8b6e3b532918?noc=559sgxds&aid=2s8hs&cid=6e134&cti=9apkw&imp=2&t=ad%2Fview&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ts=1575377918
- Requested by
- Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
- 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
securepubads.g.doubleclick.net/pcs/
Frame 6EDB
|
0
0
|
18ms
17ms
|
Fetch
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuszRmLAmA6Ujn4E8A-mrJkaulxwViVl9O1aHervknTxlhGBlHH538q-E6fI55eDr24i1JhPEPBA1QNWnhLbj6B6In5cSdN14tmPzPOCoqYIgrI9CpYHbO6Oav0bw4NalaXL3gir3hQiYWNWrAdC_Ob1kU8ba9vAy8e-KgJuWftNpZJ8ouAZuQnxVunfOHgrKtIvimzRiUPX_TMiBlY206cD7A_ORpsYf1FpczQGWSsVJyv1qYuLFjVJoktr7AH1MQ_cYP-gu6Gg8RMWIvy&sig=Cg0ArKJSzHYzvN72HE5UEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
- 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 6EDB
|
108 KB
108 KB
|
25ms
6ms
|
Script
text/javascript |
185.22.221.117
WAVECON
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 6EDB
|
76 KB
29 KB
|
38ms
38ms
|
Script
text/javascript |
2a00:1450:4001:814::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_2019111801.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e48c4975b293be404aa17aca3844095d270597494ffabe5316cad8c3e45d5004
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 6EDB
|
43 B
400 B
|
38ms
38ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 6EDB
|
43 B
400 B
|
32ms
5ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 6EDB
|
43 B
400 B
|
42ms
10ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
avc.php
Show response
media.oadts.com/www/delivery/
Frame 6EDB
|
12 KB
13 KB
|
10ms
7ms
|
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=atg7303596753&startmuted=1&cb=0.2186145714754104&loc=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%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
- c835e222d8b3ebd4420d7d7ae757cfd0f3627c11d5bebb9e703662e24a7615f9
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 6EDB
|
43 B
400 B
|
37ms
16ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
getAd
Show response
video-adserver.ibillboard.com/
Frame 6EDB
|
1 KB
1 KB
|
139ms
41ms
|
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=c7629f9fcd&ref=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%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
Prague, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- host-125.billboard.cz
- Software
-
ibillboard /
- Resource Hash
- 300a8f36e78e494d1a1428c4695fe9a611ae7a5758a5c66eae4437d2f2af5767
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 6EDB
|
43 B
307 B
|
25ms
16ms
|
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.1197444562747434&loc=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2Fhttps%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&dur=0
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
H/1.1
|
200
OK
|
vast
Show response
tracking.m6r.eu/sync/
Frame 6EDB
|
500 B
936 B
|
22ms
22ms
|
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%3Dc7629f9fcd%26ref%3Dhttps%253A%252F%252Fwww.giga.de%252Fextra%252Flivestream%252Fspecials%252Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%252F%26ngresponse%3Dtrue%26nu%3D%24%24DMP_SEGMENTS_NUGGAD%24%24%26impid%3D476d9ac6-7fc0-4ecd-a029-b8cee0810fd3
- 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.3,
, 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
- 7efa3776e9fae7550b1ce0fb32d1b75e018bd7566c10c68c2f6ffb693315b267
|
GET
H/1.1
|
200
OK
|
getAd
Show response
video-adserver.ibillboard.com/
Frame 6EDB
|
48 B
590 B
|
174ms
174ms
|
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=c7629f9fcd&ref=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ngresponse=true&nu=n4%3D2%26n3%3D1&impid=476d9ac6-7fc0-4ecd-a029-b8cee0810fd3
- 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
Prague, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- host-125.billboard.cz
- Software
-
ibillboard /
- Resource Hash
- c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame DFED
|
0
0
|
18ms
18ms
|
Fetch
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuuRpgZUhbRp10Di1eNNkj2q5bHgIuagRvFNgcQ3q8hVQg402MJSUe0MymYlnSXWhGOv6MgS40ja7dFs4pePov2QUlatQG3mizDDsGPClmr6dP6CLssIDI-rg4RoRy-w7SvBZaOfZPFUQQ3DyuBSwo_DT9hImd7s7KWJaV_4C7HgTFqFvQ3AGnAOUUehQkwOFkprfmi3NfTBZ2pcEJ4Fhmu_iuwEL9G7iEFA0KopzuBpa89YWJOqkXHmHCL4jhY2pE49b8f_73faFTJg8auYBqmHbcpTFhw9DyabsQ&sig=Cg0ArKJSzBIR1JkAHVp-EAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
mtrcs_220434.js
Show response
s79.mxcdn.net/bb-mx/serve/
Frame DFED
|
129 KB
50 KB
|
41ms
12ms
|
Script
text/javascript |
72.247.224.195
Akamai Technologies
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame DFED
|
76 KB
29 KB
|
38ms
38ms
|
Script
text/javascript |
2a00:1450:4001:814::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_2019111801.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e48c4975b293be404aa17aca3844095d270597494ffabe5316cad8c3e45d5004
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
124eca84abce0cccb0208c5ef285e6fd.gif
smbad.de/www/images/
Frame DFED
Redirect Chain
-
https://smbad.de/www/delivery/avw.php?zoneid=159&cb=576883113&n=a8157934
-
https://smbad.de/www/images/124eca84abce0cccb0208c5ef285e6fd.gif
|
799 B
1 KB
|
1ms
1ms
|
Image
image/gif |
136.243.116.5
HETZNER-AS
|
|
|
GET
H2
|
200
|
5209200161
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
43 B
249 B
|
40ms
7ms
|
XHR
application/json |
18.194.21.214
Amazon.com
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
103 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:808::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=10&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=78410589%20--%20Filmstreams%20im%20Internet%3A%20Was%20ist%20legal%3F%20Was%20nicht%3F%5Bvideojs%2F7.6.6%5D%5BUser%20Click2Play%5D&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd9=201804&cd11=78410589&cd12=SELF&cd13=69&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.6&cd44=0&cm1=1&z=288683646
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:808::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
|
200
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
239 B
|
6ms
6ms
|
XHR
text/plain |
18.194.252.229
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_220434.js
Show response
s79.mxcdn.net/bb-mx/serve/
|
129 KB
50 KB
|
12ms
12ms
|
Script
text/javascript |
72.247.224.195
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
data
lb38.s400.meetrics.net/
|
43 B
308 B
|
2ms
0ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
General
- Full URL
- https://lb38.s400.meetrics.net/data?/tpmJDDMAAKktFLkqFFlqwF23A52AwwA/k0FEEmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BmpFstFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEmpFstFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13A1zA33A5xA35A1yALlnFBUkzF2BPQGAAAAAAABuA0APBAAFAAuA0TA5iAPBAAAAA+TBBA5iAZAAAOA55A55A85B55A58E55A55AGAyxAzwAz4ArA5iAPqDAAAA+TBHA5iAPBAAAAATWBKA5iASksFPFjAAAAAAAAAAAAEAAAuA0AAAAAAAHAklFzrF0vFwBFEAmpFstFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0fFvmFfwFhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yAxAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGmFpsFtfFhyF0pFrlFslByGEv1F0fFvmFfwFhnFlBFdAAA+TBxYAAAAFAAAA5iAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFooFIUA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.206
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h213.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
a63f5aaf-bba0-4469-8581-8b6e3b532918
Show response
t.nativendo.de/cds/tracking/event/
|
0
193 B
|
16ms
15ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
a63f5aaf-bba0-4469-8581-8b6e3b532918
Show response
t.nativendo.de/cds/tracking/event/
|
0
170 B
|
19ms
18ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame DFED
|
218 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
gettag
Show response
s79.research.de.com/bb-mxad/
|
0
294 B
|
8ms
2ms
|
Script
text/javascript |
136.243.36.209
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
submit
b47.s79.research.de.com/bb-mx/
|
43 B
291 B
|
11ms
1ms
|
Image
image/gif |
144.76.237.196
HETZNER-AS
|
|
General
- Full URL
- https://b47.s79.research.de.com/bb-mx/submit?//hojBwAAA/whFpBo0F0wFz6BvvA33F3uBnpFnhFukElvBl4F0yFhvBspF2lFz0FylFhtFvzEwlFjpFhsFzvBpzF0tBzlFypFluFz0FylFhtFu0EvtBslFnhFstBvkFlyFtpEssFlnFhsFtoEplFytBlyFmhFoyF0tBpoFytBlzFvBEfpyF+k2FoywAx5AtxAxtAy1AtwA56Az0AtyAywA0zA0tAyuAxxA1uAytAkzB0zAlkFimFLlnFB/k0FwBxgAwqFpkF9yAywA0zA0mAhkFj9B02AzzAxwAymAjwFpkF9yAz0Ax3A04A2mAzpF0lF9xA0wA15Az2AmwEshFjlF9yA14A42Ax2A24AmjEpkF95A3wA52Ay4A3mAzpF6lF9iEyhFukFivFvzF0lFymBjiF91A32A44AzxAxzAL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BETkzF7FAAAAAAAZwSpWBPAAAAAAAAAOAAAAGAAAAAAAZwSpWBBPBAAAAAAAABO8zASksF4BbAAAAAAAAAAAAEAAAO8zAAAAAAAIAyzA0xA30A42AJAy1A44A2xA22A4BEHAx0Aw1A5zA2BEMAiyFhuFkiFvvFz0FlyFIA53Aw5A2yA43AHA02AzzAxwAyBEQtjF4hECUA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
144.76.237.196
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h371.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
SX8
tracker-adserver.ibillboard.com/error/impid/476d9ac6-7fc0-4ecd-a029-b8cee0810fd3/iid/d460aebc-2e03-4986-8771-92e60ecc80f8/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2...
Frame 6EDB
|
0
272 B
|
732ms
24ms
|
Image
text/plain |
62.168.44.125
GTSCE GTS Central...
|
|
General
- Full URL
- https://tracker-adserver.ibillboard.com/error/impid/476d9ac6-7fc0-4ecd-a029-b8cee0810fd3/iid/d460aebc-2e03-4986-8771-92e60ecc80f8/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2910a189/adid/85a0d494-5864-4a1e-c578-9fc94f9efa60/sensitive/SX8?erc=303
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.125
Prague, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- host-125.billboard.cz
- Software
-
ibillboard /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
tag
Show response
a.teads.tv/page/68592/
Frame 6EDB
|
1 KB
827 B
|
24ms
12ms
|
Script
application/javascript |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
teads-format.min.js
Show response
a.teads.tv/media/format/v3/
|
711 KB
185 KB
|
7ms
6ms
|
Script
text/javascript |
2.18.232.7
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
index.html
cmp.teads.mgr.consensu.org/
Frame 3311
|
0
0
|
24ms
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: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, 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 FE88
|
0
0
|
14ms
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: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, 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
|
20ms
7ms
|
Image
image/gif |
23.5.97.37
Akamai Technologies
|
|
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=1575377918501&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=58884284&cs_ucfr=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.5.97.37
, Netherlands,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a23-5-97-37.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
46ms
44ms
|
Image
image/gif |
72.247.225.182
Akamai Technologies
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
47ms
45ms
|
Image
image/gif |
72.247.225.182
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
p
sb.scorecardresearch.com/
|
43 B
309 B
|
20ms
8ms
|
Image
image/gif |
23.5.97.37
Akamai Technologies
|
|
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=1575377918521&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=32345240&cs_ucfr=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.5.97.37
, Netherlands,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a23-5-97-37.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
45ms
44ms
|
Image
image/gif |
72.247.225.182
Akamai Technologies
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
46ms
45ms
|
Image
image/gif |
72.247.225.182
Akamai Technologies
|
|
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 2582
|
0
0
|
20ms
19ms
|
Fetch
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsttu2IDYt_vvekPpEf1KMbB74aaCPJKiStPoG9TozIUKsB0Cq4hHnNfqFsUF9jpLWGFB7WIJzdiJNyfI7mWwyhvKlaEXinNzAUQXaiP29Y8eVLgYjSdoynOb47B7NJWXowpcg4bT0cmyj6er7mZNqF0GzrGQkFYYmyuVye3yxnbG5K2jkfzLOrIu-pJb6DN_f7Exo12Ao8dulH1w1g4sTugaxacRpDqTwPXhxTc-zMp5AwYzatyiWqJKL_bAROMSYjtqux85fHqBDbXrNdvksk9497agrqYOj4&sig=Cg0ArKJSzNhN5BBhw54qEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
dcmads.js
Show response
fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754020/dcm/
Frame 2582
|
199 KB
68 KB
|
81ms
40ms
|
Script
application/javascript |
199.166.0.24
Integral Ad Science
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 2582
|
76 KB
29 KB
|
39ms
38ms
|
Script
text/javascript |
2a00:1450:4001:814::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_2019111801.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e48c4975b293be404aa17aca3844095d270597494ffabe5316cad8c3e45d5004
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
5199031868
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
44 B
248 B
|
7ms
7ms
|
XHR
application/json |
18.194.21.214
Amazon.com
|
|
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 97C9
|
0
0
|
17ms
17ms
|
Fetch
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuU8fl7jci7-W3mGvp1sOOxgDgReoH5BF0Z5lT38p0kvx5f_mfYi0emf80R9K8OjcegRiOmxQj4HZ65zba1bwkFvTFox9h2orOy4mHQKER7589_3H1nMYDPoilptSSUQL7Zkgoz6pH6wXpE4UP_FgPClXMLFs3M8IPQ6aflqcEJ4jVBtqsyDSHML5XoOBmR66iKj5XqBZFQG7_qNJGnAt9QeUex5RBqAwzCPFSCriiYCiipLMHvufHJcmWiLjrzfbk_nNbpw2s6JCKg-Hqmz3LA9-RC7lhA1OI7j48&sig=Cg0ArKJSzEhSUDI_dZ2YEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
- 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 97C9
|
76 KB
29 KB
|
42ms
39ms
|
Script
text/javascript |
2a00:1450:4001:814::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_2019111801.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e48c4975b293be404aa17aca3844095d270597494ffabe5316cad8c3e45d5004
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
5209200161
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
43 B
249 B
|
9ms
7ms
|
XHR
application/json |
18.194.21.214
Amazon.com
|
|
|
GET
H2
|
200
|
tb
Show response
15.taboola.com/
|
31 KB
31 KB
|
34ms
20ms
|
Script
text/html |
151.101.14.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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&encoded=1&uid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&variant=-100|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1575377918593&tagid=&cntry=DE&platform=1&sesid=1125c4e44b9cd4114ea7a76ed13993a1&itemid=/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es&viewid=1575377917313&geolat=&geoing=&deviceifa=&appid=&sd=v2_1125c4e44b9cd4114ea7a76ed13993a1_276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d_1575377917_1575377917_CNawjgYQrMVBGIGr3d7sLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA&ri=5dfc4fc3824f0e87fbdc6bc3559261ab&appname=&cdb=&gdprApplies=&rid=&sii=8595394669299204402&oee=true&tpubid=1073836
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191130-2-RELEASE.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 705473781c1aec7f0f3374bb1d97006bd0bfd8a9c906f5204045aeab7c2a99e7
|
GET
H2
|
200
|
feed-card-placeholder.20191130-2-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
5 KB
2 KB
|
7ms
5ms
|
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
|
8ms
7ms
|
Image
image/svg+xml |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
userx.20191130-2-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
22 KB
8 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
204
|
rtb-h
trc.taboola.com/sg/mediaforcebidder-network/1/
Frame A9B0
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=425890b5-9465-4f45-9dd9-c156420b72a1
|
0
183 B
|
16ms
16ms
|
Image
text/plain |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=425890b5-9465-4f45-9dd9-c156420b72a1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
H2
|
400
|
/
trc.taboola.com/sg/rubicon-network-display/1/rtb-h/
Frame A9B0
Redirect Chain
-
https://pixel.rubiconproject.com/exchange/sync.php?p=16698
-
https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
|
0
0
|
14ms
14ms
|
Image
text/html |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/
Frame A9B0
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=8DhYlCFOe_teV0DKzEsCkG6SBF4ngcCVVIQiyLt_SjM%3D
|
45 B
104 B
|
16ms
16ms
|
Image
image/gif |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=8DhYlCFOe_teV0DKzEsCkG6SBF4ngcCVVIQiyLt_SjM%3D
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
H2
|
200
|
rtb-h
match.taboola.com/sg/mediamath-ssp-network/1/
Frame A9B0
Redirect Chain
-
https://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID]
-
https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=04765de6-5148-4c00-b117-9502c00589e2
-
https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=04765de6-5148-4c00-b117-9502c00589e2&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D04765de6-5148-4c0...
|
0
52 B
|
15ms
15ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=04765de6-5148-4c00-b117-9502c00589e2&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D04765de6-5148-4c00-b117-9502c00589e2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
204
|
/
trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/
Frame A9B0
Redirect Chain
-
https://bh.contextweb.com/bh/rtset?pid=562107&ev=1&rurl=https%3A%2F%2Ftrc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=%%VGUID%%
-
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=felCkL7ucle0&ev=1&pid=562107
|
0
74 B
|
15ms
15ms
|
Image
text/plain |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=felCkL7ucle0&ev=1&pid=562107
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
H2
|
204
|
/
trc.taboola.com/sg/rtbhouse-network/1/rtb-h/
Frame A9B0
Redirect Chain
-
https://creativecdn.com/cm-notify?pi=taboola
-
https://ams.creativecdn.com/cm-notify?pi=taboola&tc=1
-
https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=mpg5B0EdUDOrtGR05DwT&pi=taboola&tc=1
|
0
55 B
|
26ms
26ms
|
Image
text/plain |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=mpg5B0EdUDOrtGR05DwT&pi=taboola&tc=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
H2
|
200
|
rtb-h
match.taboola.com/sg/appnexus-network/1/
Frame A9B0
Redirect Chain
-
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=$UID
-
https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=3392558974024049024
-
https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=3392558974024049024&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D3392558974024049024
|
0
53 B
|
14ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=3392558974024049024&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D3392558974024049024
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/google-network/1/
Frame A9B0
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=CAESENCKJ0cP2rALSWOV6CMdERY&google_cver=1
-
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESENCKJ0cP2rALSWOV6CMdERY&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3DCAESENCKJ0cP2rALSWOV6CMdERY%26goo...
|
0
53 B
|
16ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESENCKJ0cP2rALSWOV6CMdERY&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3DCAESENCKJ0cP2rALSWOV6CMdERY%26google_cver%3D1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
204
|
/
trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/
Frame A9B0
Redirect Chain
-
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=$UID
-
https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=3392558974024049024
|
0
57 B
|
16ms
15ms
|
Image
text/plain |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=3392558974024049024
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
H2
|
200
|
rtb-h
match.taboola.com/sg/thetradedesk-network/1/
Frame A9B0
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=b0ec581d-c21b-4cdd-bd3f-b5d1c616ae12
-
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=b0ec581d-c21b-4cdd-bd3f-b5d1c616ae12&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3Db0ec581d-c21b-4cdd...
|
0
53 B
|
15ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=b0ec581d-c21b-4cdd-bd3f-b5d1c616ae12&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3Db0ec581d-c21b-4cdd-bd3f-b5d1c616ae12
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/storygize-network/1/
Frame A9B0
Redirect Chain
-
https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d
-
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=b341ede2-a00e-4913-b519-6f842f797030
-
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=b341ede2-a00e-4913-b519-6f842f797030&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3Db341ede2-a00e-4913-b5...
|
0
53 B
|
15ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=b341ede2-a00e-4913-b519-6f842f797030&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3Db341ede2-a00e-4913-b519-6f842f797030
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
cookiesync
bttrack.com/pixel/
Frame A9B0
|
35 B
380 B
|
367ms
93ms
|
Image
image/gif |
192.132.33.46
Bidtellect Inc.
|
|
|
GET
H/1.1
|
204
No Content
|
/
cds.taboola.com/
Frame A9B0
|
0
176 B
|
288ms
97ms
|
Image
text/plain |
141.226.224.32
TABOOLA-AS
|
|
General
- Full URL
- https://cds.taboola.com/?uid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&_r=6470194
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
141.226.224.32
, United States,
ASN200478
(TABOOLA-AS, IL),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/bidswitch-network/1/
Frame A9B0
Redirect Chain
-
https://x.bidswitch.net/sync?ssp=taboola
-
https://x.bidswitch.net/ul_cb/sync?ssp=taboola
-
https://prod.perf-serving.com/sync?ssp=bidswitch&bidswitch_ssp_id=taboola
-
https://prod.perf-serving.com/ul_cb/sync?ssp=bidswitch&bidswitch_ssp_id=taboola
-
https://x.bidswitch.net/sync?dsp_id=366&expires=14&user_id=499c67ba-2a1c-413c-976f-c50d54ffa7cc&ssp=taboola&user_group=1
-
https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=639863a6-76d1-419d-923a-482a0aa92574
-
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=639863a6-76d1-419d-923a-482a0aa92574&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D639863a6-76d1-419d-92...
|
0
76 B
|
14ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=639863a6-76d1-419d-923a-482a0aa92574&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D639863a6-76d1-419d-923a-482a0aa92574
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
98 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:808::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=11&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cm73=1&cm13=1&z=2009250268
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:808::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
|
ad
Show response
a.teads.tv/page/68592/
|
118 B
332 B
|
66ms
66ms
|
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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%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=55f15498-ac1c-4c47-bef2-d3c09e1beb48&formatVersion=2.22.61&env=js-web&netBw=9.3&ttfb=90
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.3,
, 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
|
77ms
77ms
|
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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%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=55f15498-ac1c-4c47-bef2-d3c09e1beb48&formatVersion=2.22.61&env=js-web&netBw=9.3&ttfb=90
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.3,
, 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
|
POST
H2
|
200
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
239 B
|
7ms
6ms
|
XHR
text/plain |
18.194.252.229
Amazon.com
|
|
|
POST
H2
|
200
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
239 B
|
6ms
6ms
|
XHR
text/plain |
18.194.252.229
Amazon.com
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
385 B
|
18ms
18ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
62 B
|
22ms
22ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
74 B
|
15ms
15ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
62 B
|
20ms
20ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
iframe
sync.teads.tv/
Frame 65B4
|
0
0
|
44ms
42ms
|
Document
text/html |
72.247.225.182
Akamai Technologies
|
|
General
- Full URL
- https://sync.teads.tv/iframe?pid=73584&userId=55f15498-ac1c-4c47-bef2-d3c09e1beb48&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&fromFormat=true&env=js-web&1575377918714
- 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
-
72.247.225.182
, United States,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a72-247-225-182.deploy.static.akamaitechnologies.com
- Software
-
akka-http/10.1.5 /
- Resource Hash
|
GET
H2
|
200
|
c3059e26607a739c14c2ab64c8_ciA2NTADNGZjNTIwN2NjYmM=.jpg
files.giga-video.de/48/af/b6/
Frame 34FB
|
35 KB
35 KB
|
38ms
11ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://files.giga-video.de/48/af/b6/c3059e26607a739c14c2ab64c8_ciA2NTADNGZjNTIwN2NjYmM=.jpg
- 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
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 6387a46bae805c27f405e88ef824bea4c91699296180acdd650eff057dcfc4c1
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
42ms
41ms
|
Image
image/gif |
72.247.225.182
Akamai Technologies
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
41ms
41ms
|
Image
image/gif |
72.247.225.182
Akamai Technologies
|
|
|
GET
H2
|
200
|
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
|
254 B
729 B
|
6ms
6ms
|
Image
image/png |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
- Requested by
- Host: fw.adsafeprotected.com
URL: https://fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754020/dcm/dcmads.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
- f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
|
GET
H/1.1
|
200
OK
|
skeleton.js
Show response
static.adsafeprotected.com/
Frame 2582
Redirect Chain
-
https://fw.adsafeprotected.com/rfw/www.googletagservices.com/346702/39754020/dcm/dcmads.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-ille...
-
https://static.adsafeprotected.com/skeleton.js
|
17 B
299 B
|
42ms
14ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
H/1.1
|
200
OK
|
sca.17.4.95.js
Show response
static.adsafeprotected.com/
Frame 13DD
|
81 KB
20 KB
|
52ms
26ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
H2
|
200
|
creative_js.js
Show response
vidstat.taboola.com/vpaid/units/14_12_0/creatives/
|
4 KB
2 KB
|
7ms
6ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
270ms
83ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=fb3f2068-5b00-a4e5-9683-b2be5d627beb&tv={c:vK3JpO,pingTime:-2,time:75,type:a,im:{sf:0,pom:1,prf:{mdA:4,mdZ:97,beA:183,beZ:184,mfA:186,cmA:187,inA:188,inZ:194,prA:194,prZ:203,si:211,poA:212,poZ:226,cmZ:226,mfZ:226,loA:248,loZ:250,ltA:257,ltZ:257}},sca:{dfp:{df:4,sz:300.250,dom:ins}},env:{gca:0},clog:[{piv:100,vs:i,r:,w:300,h:250,t:28}],es:0,sc:1,ha:1,gm:0,slTimes:{i:76,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:28,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[67~100],as:[67~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:0,fm:rJAVcpX+11|12|1311|1312|1313|14|15|161|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754020|1h|1i|1j|1k,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0,slid:[google_ads_iframe_4444/giga.de_sd/film_artikel_4,google_ads_iframe_4444/giga.de_sd/film_artikel_4__container__,sdgAdServerContainer-rectangle,rectangle-4],sinceFw:45,readyFired:true}&br=u
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H2
|
200
|
st
imprammp.taboola.com/
Frame 6614
|
0
0
|
16ms
15ms
|
Document
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=EE398D141783882171691868912&cicmp=1657475&cijs=1&dast=V7vtkCFgNxVvEREoPIQgRxVvEREoPIQgUAAAAGBvQHGcXiLIcjxmixG26Gw8litlkNl8PhaDOFEGO5TAa1QMIy-30HBeX09JhdBhnLZTKoBbKmyeV3QxqaTofPda_X_X53ndPnsItcfpXxdHn4xU7by3O6vBxuv-bw8jgdZs9f6Tm9NS_L02X3nC4vh9su-rvFLp_D7NabXJa30mx2-Rxmt9DpsrxVlpvDaDm9lUbLW-X5ywEAAADgAUCpsB_iBxAAIAIAAABAAgAAAIAioOLfQuACAAAAAAOgAOtHAwCKg-Fcd-vLbnS4Pi-7PwAAHgJAAAAGFEgABnCaSgAqcg5OAAAAAAAAAABY_v___2MA9IjPZAAylAZvDHoAHnwAHoQAAACyhrqfwfmANyXGiApWixgBAAAAQDK1eRxN6oTKogoAgCDdCuAKACDAbflaizNLd1DiLQwAAIBgbIEeFr_f7LBr_G6XAQAAAAAAAACY_Z_9owkRjbmlBbEU8Kr9AgIArP0CAgCwqRsAwFsAXNARtGIwWJ1BTDaj3WR2AAAAAHf_____eiCxmKw2ppVpNHFuTKbFYrRy-Ba-2crk2CyXm4Vje8S8ZpE-JdgAfSPCMvt9BwXl9PSYXQYZy2UyqAWypsnlN4gPGoblZBDMb8IWo9VkslkOZ8vFZDAcDUej_QncaIATNBwOFrvBYrdYDCeLyWiwHCxQIAYTnJDhaDNZjXar3WQ5nIxGs81kgxStWs1Gm8FwNZvMdrvVcDBcjkZI0ZrFbDJZzEbL3WawnIwGw8lwiDCym42cu9XErRtsNm7RxjdxCzfDwVrlMo0WrpnJs_BN3KLXx3Qa2VyO3ciLggFUexFcpBPN6fJ3uSxvzdvi1jl9DotYojlZpBPZZd9YTFYb08o0mjg3JtNiMVo5fAvfbGVybJbLzcKxr-xmI-duNXHrBpuNW7TxTdzCzXCwVrlMo4VrZvIsfBO36PUxnUY2l2M38jdWu9Vmt1sudvvGarfa7HbLxW7foTN8V5-zUXnTKjwmj_IZ-TZnToPCZbB4fxLTYtqdHTy_39GpUl00xobsm1CYDR6DQRFLBKeLdCJ6GU8XsUTytEgnqpHNY5p5PMPJaGZYGXczi8ljm3g8q9VyMlssLBaxRGm6SCd6lfF0efjFTtvLc7q8HG6_5vDyOB1mz1_pOb01L8vTZfecLi-H2y76u8Uun8Ps1ptclrfSbHb5HGa30OmyvFWWm8NoOb2VRstb5bmo_9gQo9FcN5srBsu5ZrBKAAAAAAAAAABLmDNvAgAAAHAayGIxmCyWCwAhxrp7h5Sf_tQdKFPc-DHEnC5_l8vy1rwtbp3T5zBz!&excid=22&tst=1&docw=0&cs=false
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
cmTagFEED_MANAGER.js
Show response
vidstat.taboola.com/vpaid/units/26_5_8/infra/
|
672 KB
149 KB
|
7ms
6ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
|
GET
H2
|
200
|
cmOsUnit.css
vidstat.taboola.com/vpaid/units/26_5_8/assets/css/
|
34 KB
6 KB
|
6ms
5ms
|
Stylesheet
text/css |
151.101.114.2
Fastly
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 2582
|
215 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb38.s400.meetrics.net/
|
43 B
308 B
|
4ms
3ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
General
- Full URL
- https://lb38.s400.meetrics.net/data?/tpmJEmUAA/k0F/HmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BmpFstFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEmpFstFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13A1zA33A5xA35A1yAmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA4yA25A21A1mAjwFpkF9kElzFr0FvwFmhEwhF91AywA5yAwwAx2AxmAjpFk9BxzA4yA5yA22Aw1A50AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9mEpsFtmBhwFi9BihFuuFlyFmhEwjF91AywA5yAwwAx2AxmAhwFk9B1yAw5AywAwxA2xAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEmpFstFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A31Az3A35Ax4AzyAyBELlnFCUkzFzBPGCAAAAAAABhYBAPBAAFAAhYBThRjAPAAAlEA5BABhRjAZAAAOA55A55A85B55A58E55A55AEA12A21ArhRjAPiDAlEA5BAHhRjAPuEAAAAFrBKA5iASksF9EjAAAAAAAAAAAAEAAAhYBAAAAAAAHAklFzrF0vFwBFEAmpFstFKAnpFnhFukElfFzkFGA3yA44E5wAMAxzA4yA5yA22Aw1A50AGAkpFylFj0FAAAAIAy4Ay2A52A11AKA1yAw5AywAwxA2xAGAihFuuFlyFKA1yAw5AywAwxA2xAKA1yAw5AywAwxA2xAsAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGmFpsFtfFhyF0pFrlFslByGEihFuuFlyFdlEA5BAoPAAAAFAAAhRjAAAAALAT1FwlFyCFhuFulFyBFAAAAAAAAAAAAAAAAQtjFHqC9VA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.206
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h213.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
b47.s79.research.de.com/
|
43 B
308 B
|
4ms
2ms
|
Image
image/gif |
144.76.237.196
HETZNER-AS
|
|
General
- Full URL
- https://b47.s79.research.de.com/data?//hojChIAALktFBLkqFFlqwFyyAw0Az0ATkzFPPaIAAAAAAAzqW7ASksFeCd/EAmHAUHA8AAAAAAqW7AAAQAOPFfTFPVFSDFFfFx4Ax0AxxACACBFAAAAAAAAAAAAAAGAJGFSBFNFFdJPAWEAsEA6DAAAAAJI2AAAQAOPFfTFPVFSDFFfFxxA01A22ACANSFAAAAAAAAAAAAAAGAJGFSBFNFFQtjFhkpTSA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
144.76.237.196
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h371.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
b47.s79.research.de.com/
|
43 B
308 B
|
3ms
0ms
|
Image
image/gif |
144.76.237.196
HETZNER-AS
|
|
General
- Full URL
- https://b47.s79.research.de.com/data?//hojDiIAATkzFASksFNYd/EAmHAUHA8AAAAAAK1RAAAjPo0F0wFz6BvvAnvFvnFslFhkFzuBnuBkvF1iFslFjsFpjFruBulF0vBwhFnlFhkFvhEkzF/jEspFluF09BjhFtwE1iFtzA5zA54AxzAy4A3wAzwAw4A0mAv1F0wF10F9oE0tFsmBo9B2wAmzEsvF0uFhtFl9B2yA52A4wA1zA15AmhEkrF9zA03AxyA3yAz3AxmAhkFm9Bx0A15Ay3A33AyzAm3E90A24AmsEt0F9xA13A1zA33A5xA3mAwzFh9BwmAn1FjpF9xAuyAuwAuwAuyAuyAuwAuwAmmEvyFthF09B02A44E2wAm1EysF9oE00FwzFlzABlByGElyAG3F33FunEpnFhuBklFlyAGlF40FyhFlyAGsFp2FlzF0yFlhFtlByGEzwFljFphFszFlyAGpFz0FtzElyFplFuzF0yFlhFtuB0vFtsElnFhsFtvEklFytBpsFslFnhFstBopFlyFtlEymFhoFy0FtpEoyFtlEzlByGEmmEshFzoF9wAm3EnsF9xAmhEkzFpkF9OEUmBk0F9xA13A1zA33A5xA3wA10AmiEwwF9xA4mAikF09Bx3A4mAmkF09BywAxmApkF09BywAymAzoF29ByyBwxA5xAxxA0mAjiF29ByyBwxA5wAxzAxmAzhFskFy9BhhFmhEi4Fl9BxmAjvFyyFlsFh0FvyF93Ax3A45AxxAxzA3yAxwAmmEytF9yAwmAw2F9yAmnEhfF2pFk9ByxAx1A13A42AxwAuxA13A1zA33A5xA3mAnhFfzFpkF9xA13A1zA33A5xA3mAnhFfoFpkF95Az1A5zAwyA0wAmnEhfFmjF9wAmpEhnF9wAmpEjzFn9BxyA5wAwyAz3A12A2mAkzFz6F91A3mAtkFv9BwmAtzFv9BwmA1fF06F92AwmA1fFopFz9BymA1fFqhF2hF9wAm1EfoF9xAywAwmA1fF39Bx2AwwAm1EfhFo9BxyAwwAm1EfhF39Bx2AwwAm1EfjFk9By0Am1EfuFwsF1nF9wAm1EfuFtpFtlF9wAmhEk4F9zAx4AmhEk5F90A42AmiEp3F9xA14A1mAipFo9BxyAwwAmzEjyFf4F9wAmzEjyFf5F9wAmlEpkF9yAwxA55AzzA3lAyDEyxAw2A1xAy2AmvEpkF9zAmwE2zFpkF9yAxzA0yA41AzzA43A2zAz5AwmAy4F9wAmlEhlF9wAmmEj9B45A2mAiyFkpFt9BwlAyDEwlAyDEwlAyDEwlAyDEx2AwwAlyADwBlyADxB2wAwlAyDExyAwwAlyADxB2wAwlAyDExyAwwAm2EpzF9xAmyEz6F9lA3DEl3ADlFFlB3DEmhEisF9DETmBwmF49BwmAm1F9xA2mAijF9zAxmApmFp9BxmA1jFp9BxuA16Eo1Fj2F1rEvwBxlFmmEziF9xAm4EwjF9BElMF2yBU4BTxBVmBw9Bo0F0wFzlBzBEvvA33F3uBnpFnhFukElmBk0Fk9ByxA5BECACBFAAAAAAAAAAAAAAGAJGFSBFNFFQtjFWrTcYA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
144.76.237.196
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h371.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
b47.s79.research.de.com/
|
43 B
308 B
|
3ms
1ms
|
Image
image/gif |
144.76.237.196
HETZNER-AS
|
|
General
- Full URL
- https://b47.s79.research.de.com/data?//hojEiIAA/k0FwBxgAwqFpkF9yAywA0zA0mAhkFj9B02AzzAxwAymAjwFpkF9yAz0Ax3A04A2mAzpF0lF9xA0wA15Az2AmwEshFjlF9yA14A42Ax2A24AmjEpkF95A3wA52Ay4A3mAzpF6lF9iEyhFukFivFvzF0lFymBjiF91A32A44AzxAxzAlqwFyyAw0Az0ALkmFBTkzFARksFAQtjFj7RUSA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
144.76.237.196
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h371.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
|
0
64 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:814::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_pgbrk&pvsid=2134285338763390&vrg=2019111801&nw_id=4444&nslots=5&eid=425301913&pub_url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&qid=CNmCsInEmeYCFVAI4AodcLIFXw&iu=4444%2Fgiga.de_sd%2Ffilm_artikel&e=512&ret=300x250&req=10x20%7C10x10%7C300x250%7C34x31&bm=0&efh=0&stk=0&ifi=6
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
Show response
track.adform.net/Serving/Cookie/
|
73 B
448 B
|
21ms
20ms
|
Script
text/javascript |
37.157.2.236
ADFORM
|
|
|
GET
H2
|
200
|
f9b17833-d68c-4e4d-b319-d6061d45aa9f
Show response
boot.pubstack.io/v1/tag/
|
1 KB
826 B
|
108ms
41ms
|
Script
application/javascript |
54.194.33.101
Amazon.com
|
|
|
GET
H2
|
200
|
content14_10_18m.js
Show response
vidstat.taboola.com/
|
37 KB
8 KB
|
5ms
5ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
|
GET
H2
|
200
|
oppsula.js
Show response
vidstat.taboola.com/oppsula/1.3.6/
|
15 KB
5 KB
|
5ms
5ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
|
GET
H2
|
200
|
OvaMediaPlayer.js
Show response
vidstat.taboola.com/vpaid/vPlayer/player/v10.6.2/
|
524 KB
134 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
|
GET
H2
|
200
|
sync
match.taboola.com/
Frame 0B92
|
0
0
|
17ms
16ms
|
Document
text/html |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sync?dast=V7vtkCFgNxVvEREoPIQgRxVvEREoPIQgUAAAAGBvQHGcXiLIcjxmixG26Gw8litlkNl8PhaDOFEGO5TAa1QMIy-30HBeX09JhdBhnLZTKoBbKmyeV3QxqaTofPda_X_X53ndPnsItcfpXxdHn4xU7by3O6vBxuv-bw8jgdZs9f6Tm9NS_L02X3nC4vh9su-rvFLp_D7NabXJa30mx2-Rxmt9DpsrxVlpvDaDm9lUbLW-X5ywEAAADgAUCpsB_iBxAAIAIAAABAAgAAAIAioOLfQuACAAAAAAOgAOtHAwCKg-Fcd-vLbnS4Pi-7PwAAHgJAAAAGFEgABnCaSgAqcg5OAAAAAAAAAABY_v___2MA9IjPZAAylAZvDHoAHnwAHoQAAACyhrqfwfmANyXGiApWixgBAAAAQDK1eRxN6oTKogoAgCDdCuAKACDAbflaizNLd1DiLQwAAIBgbIEeFr_f7LBr_G6XAQAAAAAAAACY_Z_9owkRjbmlBbEU8Kr9AgIArP0CAgCwqRsAwFsAXNARtGIwWJ1BTDaj3WR2AAAAAHf_____eiCxmKw2ppVpNHFuTKbFYrRy-Ba-2crk2CyXm4Vje8S8ZpE-JdgAfSPCMvt9BwXl9PSYXQYZy2UyqAWypsnlN4gPGoblZBDMb8IWo9VkslkOZ8vFZDAcDUej_QncaIATNBwOFrvBYrdYDCeLyWiwHCxQIAYTnJDhaDNZjXar3WQ5nIxGs81kgxStWs1Gm8FwNZvMdrvVcDBcjkZI0ZrFbDJZzEbL3WawnIwGw8lwiDCym42cu9XErRtsNm7RxjdxCzfDwVrlMo0WrpnJs_BN3KLXx3Qa2VyO3ciLggFUexFcpBPN6fJ3uSxvzdvi1jl9DotYojlZpBPZZd9YTFYb08o0mjg3JtNiMVo5fAvfbGVybJbLzcKxr-xmI-duNXHrBpuNW7TxTdzCzXCwVrlMo4VrZvIsfBO36PUxnUY2l2M38jdWu9Vmt1sudvvGarfa7HbLxW7foTN8V5-zUXnTKjwmj_IZ-TZnToPCZbB4fxLTYtqdHTy_39GpUl00xobsm1CYDR6DQRFLBKeLdCJ6GU8XsUTytEgnqpHNY5p5PMPJaGZYGXczi8ljm3g8q9VyMlssLBaxRGm6SCd6lfF0efjFTtvLc7q8HG6_5vDyOB1mz1_pOb01L8vTZfecLi-H2y76u8Uun8Ps1ptclrfSbHb5HGa30OmyvFWWm8NoOb2VRstb5bmo_9gQo9FcN5srBsu5ZrBKAAAAAAAAAABLmDNvAgAAAHAayGIxmCyWCwAhxrp7h5Sf_tQdKFPc-DHEnC5_l8vy1rwtbp3T5zBz!&excid=22&docw=0&cijs=1
- Requested by
- Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/26_5_8/infra/cmTagFEED_MANAGER.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
147 B
|
30ms
13ms
|
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=V7-vQCFgNxVvEREoPIQgRxVvEREoPIQgUAAAAGBvQHG8XiLIcjxmixG26Gw8lit5gtF8PZcLmYDCGjWJzlcMQYLXbDzXA4Wcw2q-FyOBxtphBiLJfJoBZIWGa_76CgnJ4es8sgY7lMBrVA1jS5_G5IQ9Pp8Lnu9brf765z-hx2kcuvMp4uD7_YaXt5TpeXw-3XHF4ep8Ps-Ss9p7fmZXm67J7T5eVw20V_t9jlc5jdepPL8laazS6fw-wWOl2Wt8pycxgtp7fSaHmrPH85AAAAADwAKBX2Q_wAAgBEAAAAAEgAAAAAUARU_FsIXAAAAABgABRg_WgAQHEwnOtufdmNDtfnZfcHAMBDAAgAwIACCcAATlMJQEXOwQkAAAAAAAAAAMv___9_DIAe8ZkMQIbSYA_Agw_AA1HBahEjAAAAAEimNo-jSZ1QWVQBABCkWwFcAQAEuC1fa3GGAQAAEIwt0MPi95sddo3f7TIAAAAAAAAAALP_s380IaIxt7QglgJetV9AAIC1X0AAADZ1AwB4C4ALOoJWDAarM4jJZrSbzA4AAADg7v___18PJBaT1ca0Mo0mzo3JtFiMVg7fwjdbmRyb5XKzcGyPmNcs0qcEG6BvRFhmv--goJyeHrPLIGO5TAa1QNY0ufwG8UHDsJwMgvlN2GK0mkw2y-FsuZgMhqPhaLQ_gRsNcIKGw8FiN1jsFovhZDEZDZaDBQrEYIITMhxtJqvRbrWbLIeT0Wi2mWyQolWr2WgzGK5mk9lutxoOhsvRCClas5hNJovZaLnbDJaT0WA4GQ4RRnazkXO3mrh1g83GLdr4Jm7hZjhYq1ym0cI1M3kWvolb9PqYTiOby7EbeVEwgGovgot0ojld_i6X5a15W9w6p89hEUs0J4t0IrvsG4vJamNamUYT58ZkWixGK4dv4ZutTI7NcrlZOPaV3Wzk3K0mbt1gs3GLNr6JW7gZDtYql2m0cM1MnoVv4ha9PqbTyOZy7Eb-xmq32ux2y8Vu31jtVpvdbrnY7Tt0hu_qczYqb1qFx-RRPiPf5sxpULgMFu9PYlpMu7OD5_c7OlWqi8bYkH0TCrPBYzAoYongdJFORC_j6SKWSJ4W6UQ1snlMM49nOBnNDCvjbmYxeWwTj2e1Wk5mi4XFIpYoTRfpRK8yni4Pv9hpe3lOl5fD7dccXh6nw-z5Kz2nt-ZlebrsntPl5XDbRX-32OVzmN16k8vyVprNLp_D7BY6XZa3ynJzGC2nt9Joeas8F_UfG2I0mutmc8VgOdcMVgkAAAAAAAAAYAlz5k0AAAAATgNZLAaTxXIBIMRYd--Q8tOfugNlihs_hpjT5e9yWd6at8Wtc_ocBg!&cmcv=&pix=31589837&cb=1575377919191&uv=2658&tms=1575377919191&abt=afc7_vD!des2_vA!expl_vB!pix100!pix100!pl53468-288_vB!u2658_vA!ufm_vA&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1575377916767.337!ts:1575377919191&
- 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 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
53 B
|
30ms
14ms
|
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=V7-vQCFgNxVvEREoPIQgRxVvEREoPIQgUAAAAGBvQHG8XiLIcjxmixG26Gw8lit5gtF8PZcLmYDCGjWJzlcMQYLXbDzXA4Wcw2q-FyOBxtphBiLJfJoBZIWGa_76CgnJ4es8sgY7lMBrVA1jS5_G5IQ9Pp8Lnu9brf765z-hx2kcuvMp4uD7_YaXt5TpeXw-3XHF4ep8Ps-Ss9p7fmZXm67J7T5eVw20V_t9jlc5jdepPL8laazS6fw-wWOl2Wt8pycxgtp7fSaHmrPH85AAAAADwAKBX2Q_wAAgBEAAAAAEgAAAAAUARU_FsIXAAAAABgABRg_WgAQHEwnOtufdmNDtfnZfcHAMBDAAgAwIACCcAATlMJQEXOwQkAAAAAAAAAAMv___9_DIAe8ZkMQIbSYA_Agw_AA1HBahEjAAAAAEimNo-jSZ1QWVQBABCkWwFcAQAEuC1fa3GGAQAAEIwt0MPi95sddo3f7TIAAAAAAAAAALP_s380IaIxt7QglgJetV9AAIC1X0AAADZ1AwB4C4ALOoJWDAarM4jJZrSbzA4AAADg7v___18PJBaT1ca0Mo0mzo3JtFiMVg7fwjdbmRyb5XKzcGyPmNcs0qcEG6BvRFhmv--goJyeHrPLIGO5TAa1QNY0ufwG8UHDsJwMgvlN2GK0mkw2y-FsuZgMhqPhaLQ_gRsNcIKGw8FiN1jsFovhZDEZDZaDBQrEYIITMhxtJqvRbrWbLIeT0Wi2mWyQolWr2WgzGK5mk9lutxoOhsvRCClas5hNJovZaLnbDJaT0WA4GQ4RRnazkXO3mrh1g83GLdr4Jm7hZjhYq1ym0cI1M3kWvolb9PqYTiOby7EbeVEwgGovgot0ojld_i6X5a15W9w6p89hEUs0J4t0IrvsG4vJamNamUYT58ZkWixGK4dv4ZutTI7NcrlZOPaV3Wzk3K0mbt1gs3GLNr6JW7gZDtYql2m0cM1MnoVv4ha9PqbTyOZy7Eb-xmq32ux2y8Vu31jtVpvdbrnY7Tt0hu_qczYqb1qFx-RRPiPf5sxpULgMFu9PYlpMu7OD5_c7OlWqi8bYkH0TCrPBYzAoYongdJFORC_j6SKWSJ4W6UQ1snlMM49nOBnNDCvjbmYxeWwTj2e1Wk5mi4XFIpYoTRfpRK8yni4Pv9hpe3lOl5fD7dccXh6nw-z5Kz2nt-ZlebrsntPl5XDbRX-32OVzmN16k8vyVprNLp_D7BY6XZa3ynJzGC2nt9Joeas8F_UfG2I0mutmc8VgOdcMVgkAAAAAAAAAYAlz5k0AAAAATgNZLAaTxXIBIMRYd--Q8tOfugNlihs_hpjT5e9yWd6at8Wtc_ocBg!&cmcv=&pix=&cb=1575377919216&uv=2658&tms=1575377919216&abt=afc7_vD!des2_vA!expl_vB!pix100!pix100!pl53468-288_vB!u2658_vA!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 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
POST
H2
|
204
|
ngx_pagespeed_beacon
Show response
www.giga.de/
|
0
73 B
|
7ms
7ms
|
XHR
text/plain |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/ngx_pagespeed_beacon?url=http%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
- 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
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
BLOB
|
206
Partial Content
|
b7d2eb12-5c24-4148-9ee8-d96c134d82f1
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
BLOB
|
206
Partial Content
|
93856c50-7986-4e5c-9efa-192f40dc5399
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb38.s400.meetrics.net/
|
43 B
308 B
|
2ms
1ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
General
- Full URL
- https://lb38.s400.meetrics.net/data?/tpmJFUaAA/k0FFMmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BmpFstFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEmpFstFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13A1zA33A5xA35A1yAmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA4yA25A21A1mAjwFpkF9kElzFr0FvwFmhEwhF91AywA5yAwwAx2AxmAjpFk9BxzA4yA5yA22Aw1A50AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9mEpsFtmBhwFi9BihFuuFlyFmhEwjF91AywA5yAwwAx2AxmAhwFk9B1yAw5AywAwxA2xAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEmpFstFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A31Az3A35Ax4AzyAymEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29By4A01AwzA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA55AwzAx4A24AmjEpkF9xAz4Ay5Aw4AzzAx4A1mAzpF6lF9zAwwA4yB1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9mEpsFtmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA55AwzAx4A24AmhEwkF91Ax5A5wAzxA42A4mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGmFpsFtfFhyF0pFrlFslByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A31Az3A35Ax4A43AwBELlnFDLl1FDUkzF2BPSAAAAAAAABrYyAPBAAFAArYyTbosAPAAAJPAWEABbosAZAAAOA55A55A85B55A58E55A55AGAywA2zA35ArbosAPqFAJPAWEAHbosAPDAAAZAwSAcAAAASksFSFjAAAAAAAAAAAAEAAArYyAAAAAAAHAklFzrF0vFwBFEAmpFstFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA5wA4zAzxA41AGAkpFylFj0FAAAAIAy4A01AwzA31AKA1xA55AwzAx4A24AJAylFj0FhuFnsFlBFKA1xA55AwzAx4A24AKA1xA55AwzAx4A24AvAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGmFpsFtfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAWEAsEA6DAFAAAbosAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFrsRAZA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.206
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h213.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
39ms
12ms
|
Script
text/javascript |
72.247.225.134
Akamai Technologies
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/285/5184/s/
|
39 KB
14 KB
|
52ms
13ms
|
Script
application/javascript |
89.163.159.101
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
1 KB
1014 B
|
99ms
23ms
|
Script
application/javascript |
62.168.44.118
GTSCE GTS Central...
|
|
|
GET
H2
|
200
|
default.js
Show response
ups.xplosion.de/loader/69511/
|
2 KB
2 KB
|
29ms
28ms
|
Script
text/javascript |
54.77.22.22
Amazon.com
|
|
|
GET
H2
|
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
581 B
|
74ms
17ms
|
Image
image/gif |
35.186.238.175
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
255ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=fb3f2068-5b00-a4e5-9683-b2be5d627beb&tv={c:vK3Jxv,pingTime:-10,time:552,type:s,mvn:ZnNjPTEyLHNkPTMsbm89Nyxhc3A9MQ--,fsc:17.4.95v220002022020220000022002222000022220202020222220222220002222022002222200002220222022222222222000220200000022220222220222222222222202222222222222222222222222222222222222200000022022020020000002002202022022022222222000000000020222202022022222000000020000000000000000000002220002220000022200222202220022200200222022202220022222220020222222000220000222202222202222000002002002222222222220022202200022002220222202,sd:MTcuNC45NXYxMjAwfHwxNjAwfHwxfHwxfHwyNHx8MTIwMHx8MHx8MHx8MXx8bGFuZHNjYXBlLXByaW1hcnl8fDI0fHw0LzN8fDQvM3x8MHx8MTYwMA--,no:MTcuNC45NXZNb3ppbGxhfHxOZXRzY2FwZXx8bnx8MTZ8fG58fDB8fG58fExpbnV4IHg4Nl82NHx8R2Vja298fDIwMDMwMTA3fHwtNjB8fE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE0XzUpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NC4wLjM3MjkuMTY5IFNhZmFyaS81MzcuMzZ8fDF8fDF8fEdvb2dsZSBJbmMufHxu,asp:1575377919288||83dd147e17793e740136f2eb571f746b||675c74d5f114ba25a49fb0f4cb02f70f||5b812224f7f7b01e00197e6e05ff6f31||b1479fec96c34ee7f561eddbd23d7ee6||184ba19eeb0e03b625da239674eff0e7||61a4197de852fcf5d5571fe0646ded0d||a8c10898096c0503a0cdb642b54a64d3||1529428597}
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
BLOB
|
200
OK
|
bb346c4a-2146-4364-aae2-e6625eb518a0
https://videos.giga.de/
Frame 34FB
|
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 34FB
|
53 B
703 B
|
31ms
11ms
|
XHR
application/json |
52.219.72.195
Amazon.com
|
|
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame 34FB
|
265 B
436 B
|
8ms
8ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
5199031868
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
44 B
248 B
|
8ms
7ms
|
XHR
application/json |
18.194.21.214
Amazon.com
|
|
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
52 B
|
14ms
14ms
|
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=V7-vQCFgNxVvEREoPIQgRxVvEREoPIQgUAAAAGBvQHG8XiLIcjxmixG26Gw8lit5gtF8PZcLmYDCGjWJzlcMQYLXbDzXA4Wcw2q-FyOBxtphBiLJfJoBZIWGa_76CgnJ4es8sgY7lMBrVA1jS5_G5IQ9Pp8Lnu9brf765z-hx2kcuvMp4uD7_YaXt5TpeXw-3XHF4ep8Ps-Ss9p7fmZXm67J7T5eVw20V_t9jlc5jdepPL8laazS6fw-wWOl2Wt8pycxgtp7fSaHmrPH85AAAAADwAKBX2Q_wAAgBEAAAAAEgAAAAAUARU_FsIXAAAAABgABRg_WgAQHEwnOtufdmNDtfnZfcHAMBDAAgAwIACCcAATlMJQEXOwQkAAAAAAAAAAMv___9_DIAe8ZkMQIbSYA_Agw_AA1HBahEjAAAAAEimNo-jSZ1QWVQBABCkWwFcAQAEuC1fa3GGAQAAEIwt0MPi95sddo3f7TIAAAAAAAAAALP_s380IaIxt7QglgJetV9AAIC1X0AAADZ1AwB4C4ALOoJWDAarM4jJZrSbzA4AAADg7v___18PJBaT1ca0Mo0mzo3JtFiMVg7fwjdbmRyb5XKzcGyPmNcs0qcEG6BvRFhmv--goJyeHrPLIGO5TAa1QNY0ufwG8UHDsJwMgvlN2GK0mkw2y-FsuZgMhqPhaLQ_gRsNcIKGw8FiN1jsFovhZDEZDZaDBQrEYIITMhxtJqvRbrWbLIeT0Wi2mWyQolWr2WgzGK5mk9lutxoOhsvRCClas5hNJovZaLnbDJaT0WA4GQ4RRnazkXO3mrh1g83GLdr4Jm7hZjhYq1ym0cI1M3kWvolb9PqYTiOby7EbeVEwgGovgot0ojld_i6X5a15W9w6p89hEUs0J4t0IrvsG4vJamNamUYT58ZkWixGK4dv4ZutTI7NcrlZOPaV3Wzk3K0mbt1gs3GLNr6JW7gZDtYql2m0cM1MnoVv4ha9PqbTyOZy7Eb-xmq32ux2y8Vu31jtVpvdbrnY7Tt0hu_qczYqb1qFx-RRPiPf5sxpULgMFu9PYlpMu7OD5_c7OlWqi8bYkH0TCrPBYzAoYongdJFORC_j6SKWSJ4W6UQ1snlMM49nOBnNDCvjbmYxeWwTj2e1Wk5mi4XFIpYoTRfpRK8yni4Pv9hpe3lOl5fD7dccXh6nw-z5Kz2nt-ZlebrsntPl5XDbRX-32OVzmN16k8vyVprNLp_D7BY6XZa3ynJzGC2nt9Joeas8F_UfG2I0mutmc8VgOdcMVgkAAAAAAAAAYAlz5k0AAAAATgNZLAaTxXIBIMRYd--Q8tOfugNlihs_hpjT5e9yWd6at8Wtc_ocBg!&cmcv=&uv=2658&unm=FEED_MANAGER&cb=1575377919380&abt=afc7_vD!des2_vA!expl_vB!pix100!pix100!pl53468-288_vB!u2658_vA!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 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 34FB
|
724 B
1 KB
|
42ms
7ms
|
XHR
application/json |
13.225.78.95
Amazon.com
|
|
|
GET
H2
|
200
|
monitoring.js
Show response
acdn.prod.pubstack.io/
|
61 KB
62 KB
|
47ms
17ms
|
XHR
application/javascript |
2620:1ec:bdf::10
Microsoft Corpora...
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
map
ih.adscale.de/
Frame F15D
|
0
0
|
50ms
25ms
|
Document
text/html |
72.247.225.134
Akamai Technologies
|
|
|
GET
H2
|
200
|
segments
Show response
api.theadex.com/v0.9/pub/
|
56 B
126 B
|
42ms
13ms
|
Script
text/plain |
89.163.159.125
MYLOC-AS
|
|
General
- Full URL
- https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
- Requested by
- Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
89.163.159.125
Cloppenburg, Germany,
ASN24961
(MYLOC-AS, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
|
GET
H2
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.2.18/
|
5 KB
2 KB
|
29ms
13ms
|
Script
application/javascript |
2600:9000:2156:3a00:1c:8c89:a300:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
Frame 34FB
|
194 KB
57 KB
|
10ms
9ms
|
XHR
application/javascript |
13.225.78.95
Amazon.com
|
|
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
32ms
32ms
|
Script
text/javascript |
54.77.22.22
Amazon.com
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=c691c1b2ce4aa7b0c77ae005c6c76af2&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=962860830739
- 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
- a52f6ae223268cd95cd086b2cb01396c1337d3ac5a0d06acefe0fba13fdad3a0
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 34FB
|
194 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
848 B
|
125ms
31ms
|
Script
application/javascript |
63.34.92.224
Amazon.com
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
Frame FCC9
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFWSBFWsb-ES_CWSUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://uss.xplosion.de/usersync?sid=65966&fpid=4211298130613448577
|
42 B
659 B
|
35ms
34ms
|
Image
image/gif |
54.77.22.22
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame 453A
|
0
0
|
120ms
29ms
|
Document
text/html |
108.128.71.27
Amazon.com
|
|
|
OPTIONS
H2
|
204
|
error
Show response
intake.prod.pubstack.io/v1/intake/
|
0
178 B
|
92ms
29ms
|
XHR
text/plain |
52.18.103.144
Amazon.com
|
|
|
OPTIONS
H2
|
204
|
auction
Show response
intake.prod.pubstack.io/v1/intake/
|
0
178 B
|
91ms
28ms
|
XHR
text/plain |
52.18.103.144
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
251ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=fb3f2068-5b00-a4e5-9683-b2be5d627beb&tv={c:vK3JFP,pingTime:1,time:1068,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:28}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1068,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:28,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1059~100],as:[1059~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:291,fm:rJAVcpX+11|12|1311|1312|1313|14|15|161|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754020|1h|1i|1j|1k,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
255ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=fb3f2068-5b00-a4e5-9683-b2be5d627beb&tv={c:vK3JFQ,pingTime:1,time:1069,type:c,clog:[{piv:100,vs:i,r:,w:300,h:250,t:28}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1069,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:28,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1060~100],as:[1060~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:291,fm:rJAVcpX+11|12|1311|1312|1313|14|15|161|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754020|1h|1i|1j|1k,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0,metricId:forwrd1,cmr:t}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
POST
H2
|
204
|
error
Show response
intake.prod.pubstack.io/v1/intake/
|
0
57 B
|
29ms
29ms
|
XHR
text/plain |
52.18.103.144
Amazon.com
|
|
|
POST
H2
|
204
|
auction
Show response
intake.prod.pubstack.io/v1/intake/
|
0
57 B
|
29ms
29ms
|
XHR
text/plain |
52.18.103.144
Amazon.com
|
|
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 2582
|
42 B
116 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:814::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsu0nTy3MBRubzZrpYFGOC35jY1tgQ1MYxgkdUn_64l6mebWTzQ3HV9EkvT2JHjaLCChyU7Yf1ux03NAefMOH50ADustO8rHOVfGOmBzCjc&sig=Cg0ArKJSzEchIqCLYOp1EAE&adk=1946589169&tt=-1&bs=1585%2C1200&mtos=1036,1036,1036,1036,1036&tos=1036,0,0,0,0&p=278,968,528,1268&mcvt=1036&rs=0&ht=0&tfs=107&tls=1143&mc=1<e=1&bas=0&bac=0&met=ie&avms=nio&exg=1&md=2&lm=2&rst=1575377918559&dlt&rpt=313&isd=0&msd=0&ext&imams=1&xdi=0&mxd=1&ps=1585%2C6897&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-6-10-2-9-9-0-0-0&tvt=1143&is=300%2C250&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&r=v&id=osdim&vs=4&uc=10&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191115
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::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
|
usersync
uss.xplosion.de/
|
42 B
658 B
|
30ms
29ms
|
Image
image/gif |
54.77.22.22
Amazon.com
|
|
|
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 34FB
|
53 B
703 B
|
31ms
11ms
|
XHR
application/json |
52.219.72.195
Amazon.com
|
|
General
- Full URL
- https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=1295745480
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGVlQmljaGFoTWlhTWVlR2g9ZWVCaWNoYWhNaWFNZWVHaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZmZ8fCh4LmZmPTApO3guZmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5mZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5IayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2IudmYoYyk7Yi5BbihtKTtiLnpuKGwpO2Iubm4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Jbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS51aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5pbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGs9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlptLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5naD17fTt0aGlzLnNmPSExfWMuY2o9YTthLnByb3RvdHlwZT17Wm46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnNmfHwodGhpcy5zZj1lLlgoMTApKTtyZXR1cm4gdGhpcy5zZn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmdoW2JdJiYodGhpcy5naFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlpuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx6azpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sWm06ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuWW0oYi5kYXRhKX0sWW06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxCZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5XZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMueWQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxXZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx4azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnRsKGIpKXJldHVybjsoYT10aGlzLkJnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx0bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFVnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxLbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHhmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuYWwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuS24oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sSms6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGFsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5KayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxEZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxwaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFRoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGttOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scWQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAphbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxGajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxoazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQWkoKXx8Yi5IaSgpfHxiLmFtKCl8fGIuRmooKXx8Yi5oaygpfHxiLnNqKCl8fGIuVWooKX19O3JldHVybiBudWxsIT1iLkRrKCl9LHlsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxkbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxSbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxRZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMua2koYSkrIjoiK3RoaXMua2koTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGtpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx1ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE5nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxhbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk1sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sU246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLnZhKGIsITApO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS52YShmLCEwKTtmPW0udmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFFkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uT2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnVkKGIpOiIifSx1ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG1nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5wbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnFmJiZ3aW5kb3cuc2FuZGJveC5xZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLkxnKGIpKXJldHVybiB0aGlzLkxnKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS53ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy54ayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHlkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5bTpmdW5jdGlvbihiLGEsZCl7dGhpcy55ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx1aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMueW0oZi53ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGNwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxGazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0saW06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmJqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWm89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5rbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmJwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuZ2c9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuWmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5kZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5oZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EucGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuYmc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Gbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS4kbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLlprPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5tZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5mZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eucms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5iZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnFrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5yaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuemQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS55Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuWW89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQm89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Bbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLmZsfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxJbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnRkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudGQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG5oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5JbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnRkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmRqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuSWk9YX0pKGMpO3ZhciBLPWMuSWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Ca3x8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Laj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5CbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scGY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sR2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudGgmJkwuWW4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxqbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLktqfHx0OyhmdW5jdGlvbihjKXtjLk1qPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5EZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTW46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRW46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sR2Q6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnRrKCk7dGhpcy5HZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHRrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxTaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LE9oOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkRnfHwodGhpcy5EZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLk1qfHxxOyhmdW5jdGlvbihjKXtjLnppPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuV2Y9IjEiO3RoaXMuWGY9IjIiO3RoaXMubWs9IjMiO3RoaXMuJGM9MDt0aGlzLkZtPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5pZz10aGlzLm1pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMudmYoYSk7dGhpcy5DbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm1pfHwodGhpcy5taT0hMCxlLlhlKCkpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGNtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0sZ206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMud2YoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmNtKCk7aWYoIXRoaXMuZ20oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMud2YoKTtyZXR1cm59dGhpcy53ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuZ2koKTt0aGlzLmlnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy56YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGdpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldmfSx3ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWGZ9LEpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ta30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxhZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5XZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWGZ9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx2ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxHbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEJtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy56aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Canx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLnRvfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuS2coKTt0aGlzLk1nKCk7dGhpcy5Zaz0hMX0sS2c6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5JZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSWQoYil9LmJpbmQodGhpcykpfSxJZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5uanx8cmE7KGZ1bmN0aW9uKGMpe2MubWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5rZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgZz0wO2c8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7ZysrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbZ10udGFnKXt0aGlzLnliPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueWI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMueWI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0KImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPGQubGVuZ3RoO2crKylhLm9uKGRbZ10sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtnXSYmKHRoaXMuaGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtnXSYmdGhpcy5BaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkZtJiYhdGhpcy56YSgpJiYodGhpcy55Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLApmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLllrPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5CZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmFkLmluZGV4T2YoYikmJnRoaXMuYWQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmFkLmxlbmd0aD49dGhpcy5rZSYmdGhpcy5nKCkpfSwKQm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRGYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmhlfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuS2coKSxiLk1nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLm1qfHxzYTsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT0KdGhpcy5DbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKWEucHVzaChiW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpO3RoaXMuTChnKXx8dGhpcy5qbShnKXx8KHRoaXMuTihnKSxnPW5ldyBzYShnLHRoaXMuRyksZy5LKCksZy5mKCkpfX10aGlzLlAoKX19LEpwOmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LENsOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihhLmFuY2hvcil9fSl9KShjKTt2YXIgdGE9Yy5vanx8dGEsdWE9bmV3IHRhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuYm98fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmNrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEpe3ZhciBiPWEuZWxfO2J8fChiPWEuZWwoKSk7Yj8odGhpcy5UKGIpLChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYSl7dGhpcy5QZChhKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFiWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuYXV0b3BsYXk/YS5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHdhPWMuY2t8fHdhOyhmdW5jdGlvbihjKXtjLmJrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5LYz10aGlzLkJhPXRoaXMuZWQ9ITE7dGhpcy5KaD1lLkxiKDEwKTt0aGlzLklmPSEwO3RoaXMueGM9dGhpcy5raD0hMTt0aGlzLkttKGEuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy56aCgpLHRoaXMuS2soKSx0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGEuViwiOyIsdHlwZW9mIGEuViwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYS5WP2EuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGEuVj90eXBlb2YgYS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYS5pbWEsIjsiLHR5cGVvZiBhLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGEuSCwiOyIsdHlwZW9mIGEuSCwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLmltYT9hLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5pbWEmJmEuaW1hLkVhP2EuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IixhLmltYSYmYS5pbWEuRWE/dHlwZW9mIGEuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5mZToKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixhLkg/YS5ILmZlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILmdlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZ2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/CnR5cGVvZiBhLkgubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5xZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuSmgpfSxIYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5pbWEzJiYodGhpcy5pbWE9YS5pbWEzKTtpZihhLmltYSl7dGhpcy5pbWE9YS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LEljOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmEpe3ZhciBhPXRoaXMuSGMoKTthJiYoYS5hZHNMb2FkZXImJih0aGlzLm5hPWEuYWRzTG9hZGVyKSxhLl9hZHNMb2FkZXImJih0aGlzLm5hPWEuX2Fkc0xvYWRlciksYS5nZXRBZHNMb2FkZXImJih0aGlzLm5hPWEuZ2V0QWRzTG9hZGVyKSxhLmNvbnRyb2xsZXImJmEuY29udHJvbGxlci5zZGtJbXBsJiZhLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm5hPWEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm5hfSxZZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGhtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuamgpe3ZhciBhPQp0aGlzLkhjKCksYj10aGlzLmZtKCk7d2luZG93LmltYSYmYSYmKGEuX2Fkc0xvYWRlcnx8YS5hZHNMb2FkZXJ8fGIpJiYodGhpcy5qaD0hMCl9cmV0dXJuIHRoaXMuamh9LGZtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5lZCYmYS5hZHMmJihhLmFkcy5zdGF0ZXx8YS5hZHMuX3N0YXRlKSYmKHRoaXMuZWQ9ITApO3JldHVybiB0aGlzLmVkfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWMoKTtpZihhKXt2YXIgYj0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rbigpfS5iaW5kKHRoaXMpKSwKYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxrbjpmdW5jdGlvbigpe3RoaXMueGM9ITA7dmFyIGE9dGhpcy5ZZygpO2lmKGF8fHRoaXMuemEoKSl7dmFyIGI9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5jYShiKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuU2EoKSYmKGQ9Ik1fIik7YS5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDsKaWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYi5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnljfHwodGhpcy5tKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5iYSgpLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LElwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5BZyYmYS5hZHMmJih0aGlzLkFnPWEuYWRzKTtyZXR1cm4gdGhpcy5BZ30sS2s6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7CnRoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLkFoKCl9LmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YSYmKChhPXRoaXMuWWcoKSkmJmEuZGVzdHJveT9hLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoKX0uYmluZCh0aGlzKSw1MCkpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcoKSYmMDxhLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5obSgpKXt2YXIgYj10aGlzLkhjKCksZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLncoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5raD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8KKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMua2g9ITA7YS5pc1BsYXlpbmcoKSYmMTA8YS5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDUwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sTGs6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpOwpyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGsoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIGUueGU/ITE6dGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXtpZih0aGlzLllsKCkpe3RoaXMudWE9ITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXRoaXMuSWY9ITEsZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsInNldCIsITApO3RoaXMuZyghMCl9ZWxzZSB0aGlzLnVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpfSxZbDpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPQohMTtlLnlkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2E9IWUuZmIoYi5jYyl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthPSExfSwhMCwhMCk7dmFyIGI9ZS55bCgpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUueGU9LTEhPWIuaW5kZXhPZigiZmlyZWZveCIpfHwtMSE9Yi5pbmRleE9mKCJzYWZhcmkiKXx8YX1yZXR1cm4hMX0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy56YSgpfHwoYXx8KHRoaXMuSWY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSWYsZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApUazpmdW5jdGlvbigpe3RoaXMuUnB8fCgxMDx0aGlzLkxvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuTG8rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5zbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxzbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Nbyl7dGhpcy5Nbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmEudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5kaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuWGgod2luZG93KTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl0cnl7Yj1ifHx0aGlzLlhoKGFbZ10pfWNhdGNoKGQpe310aGlzLlAoKX19LFhoOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTt2YXIgeWE9Yy5ka3x8eWEsemE9bmV3IHlhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Baj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEFhPWMuQWp8fEFhO25ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuZ2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTsKcmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5XKGEpOnRoaXMuWigpfSxWbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZiLGc9dGhpcy5oYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5qYyYmKDA8PWcuaW5kZXhPZihkKXx8Yi5CZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuZ2Y9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKd2E6ZnVuY3Rpb24oKXt0aGlzLmdmKys7aWYoMTA8dGhpcy5nZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgphJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7dmFyIEJhPWMuSGp8fEJhOyhmdW5jdGlvbihjKXtjLkdqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5IYisrLDE1PHRoaXMuSGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPQohMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpOwp2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm9sPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5vbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlZtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Hanx8Q2E7KGZ1bmN0aW9uKGMpe2MuSWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBCYShhW2JdKTtnLmphfHx0aGlzLkwoZyl8fCh0aGlzLk4oZyksKG5ldyBDYShnLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Janx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuVGx8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlVnKGEsImVsZW1lbnRJRCIpOwpzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLlhtPWEucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1hLndpZHRoO2cuc3R5bGUubWluV2lkdGg9YS53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5YbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5yZD1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMucmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnJkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sU2s6ZnVuY3Rpb24oKXtlLnBoKHRoaXMucmQpO2UuT2UodGhpcy5yZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5qanx8R2E7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaWp8fEhhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiYKbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5VZyhhLCJlbGVtZW50SUQiKTtpZihlLnBoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmtqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy53anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPQoiR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxEbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHVrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixnLGQsZil7dGhpcy5YYT1iO3RoaXMuUGc9dGhpcy51aT0hMTt0aGlzLkJoPWQ7dGhpcy5ZaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmCjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJm0mJm0uUmUodGhpcy5YYS51cmwpJiZtLlZjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5EbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiKwpkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlBnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0aGlzLmhiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5ZaD90aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy51aXx8KHRoaXMuaGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwKInJlcXVlc3RfZmFpbGVkIiwhMCk6bS5SZSh0aGlzLlhhLnVybCksdGhpcy5CaCYmdGhpcy5CaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9Yy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkRhPXRoaXMuYmU9ITF9Yy5KaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihiKXt0aGlzLmJlPWJ9LEduOmZ1bmN0aW9uKGIpe3RoaXMuRGE9Yn0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIiwicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIiwKdnA6IkFkU2tpcHBlZCIsd3A6IkFkU3RhcnRlZCIsbHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixtcDoiQWRJbXByZXNzaW9uIixpcDoiQWRDcmVhdGl2ZVZpZXciLHBwOiJBZFZpZGVvTWlkcG9pbnQiLHFwOiJBZFBhdXNlZCIsc3A6IkFkVmlkZW9TdGFydCIsdHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5iZSxhW2RdKX0scG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmFlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmFlKXRoaXMuRGEuYWUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuRGEsdGhpcy5EYS5hZVthXSk7dGhpcy5EYSYmdGhpcy5EYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYS5nZXRFcnJvcigpO2ImJmNvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsImdvdCBlcnJvciIsYil9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5iZSYmdGhpcy5xbigpO3RoaXMuRGEmJnRoaXMucG4oKX19fSkoYyk7dmFyIE1hPWMuSml8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IYT0hMTt0aGlzLiRiPSIiO3RoaXMuZmQ9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5HZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm5mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuWmQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7CnRoaXMuWWQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnZiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLldiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLlBiPSIiO3RoaXMuUWI9W107dGhpcy5SYj1bXTt0aGlzLlVjPVtdO3RoaXMub2M9IiI7dGhpcy5BYj0hMTt0aGlzLk9kPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaWM9ITE7dGhpcy52Zz10aGlzLlVkPW51bGw7dGhpcy56Zj10aGlzLlZiPXRoaXMuRmc9dGhpcy5TZD10aGlzLlZjPXRoaXMuaGQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnZkPTA7dGhpcy5maD0hMTt0aGlzLmVoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy4kYixhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlpiLGFkdGFncmVnZXg6dGhpcy5mZCxiaXRyYXRlOnRoaXMuT2EsanNwb3B1cHM6dGhpcy5UZSxzaWRlbG9hZHM6dGhpcy50YixkaXNhYmxldGVzdHM6dGhpcy5HZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLlNlLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnBhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuWmQsSE9NQURfQkxPQ0tFRDp0aGlzLllkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsCnRlc3RUYWdzWEhSOnRoaXMuVWMsdGVzdDNQQ29va2llOnRoaXMub2MsdGhyb3R0bGU6dGhpcy5PZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLmljLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudmcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5zYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuaGQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuVmMsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuU2QsY29uZmlnRmFpbHVyZXM6dGhpcy5aYSxzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5yZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLnpmLHZtYXBzOnRoaXMuTmYsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHluOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy4kYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLmpiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuWmI9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5mZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkdnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuU2U9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuSmM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5wYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9CmIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLlpkPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuWWQ9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMudmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5XYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMub2M9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLk9kPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmljPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLnZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuaGQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmCih0aGlzLlZjPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuU2Q9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLlphPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5yZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuemY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmCih0aGlzLk5mPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuemM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmllPWIuYWRGYWxsYmFja1VSTCl9LFZsOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09dHlwZW9mIHRoaXMuWmFbYV0mJjE9PXRoaXMuWmFbYV0mJihiPSEwKTtyZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYil7dGhpcy5aYVtiXT0hMH0sRGw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxNZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9ZS5GayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fAp0aGlzLlpifHx0aGlzLmZkKSYmKGg9dGhpcy5IbShoKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkZsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sUWU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKTGM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuZ2EmJnRoaXMuZ2EubGVuZ3RoJiYwPHRoaXMuZ2EubGVuZ3RoJiYoYT10aGlzLmdhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFJlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuUWUoYik7cmV0dXJuIGF9LEZsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwOwpyZXR1cm4ibm9uZSJ9LHdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2FbdGhpcy5yZl19LFBjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy53ZCgpLGE9dGhpcy5UaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSx4aDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxHbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPApoLmxlbmd0aDtGKyspe3ZhciBrPWhbRl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy54aChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZiloLnB1c2gobCsiPSIrZltsXSk7Zj1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMueGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxIbTpmdW5jdGlvbihiKXt0aGlzLiRiJiYoYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5HbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sUms6ZnVuY3Rpb24oKXt0aGlzLnlhJiYKdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLk1rKHRoaXMueWEuY2xpZW50QVBJcyl9LE1rOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmYS5IbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuR24oYi5wbGF5ZXIpO2EuZigpfX0saTpmdW5jdGlvbihiLGEsZCxmLGMsZSl7bT10aGlzO3RoaXMuU2U9ITA7dGhpcy5KYz1iO3RoaXMucGE9YTt0aGlzLm5mPWQ7dGhpcy5VZD1mO3RoaXMuRGM9Yzt0aGlzLnlhPWV8fHt9O3RoaXMuUmsoKTt0aGlzLnhtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnBhKXRoaXMudm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSwKcmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LHhtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLkpjK3RoaXMub2UoImdsb2JhbCIpKSx0aGlzLlNsLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnRmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuQWMoKX0uYmluZCh0aGlzKSwhMCl9LHZtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLnBhK3RoaXMub2UoImNsaWVudCIsLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoKIj8iKSsoImNhY2hlPSIrdGhpcy5MYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGRhOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhkKXt0aGlzLmhkPSEwO3ZhciBhPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChnKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpOwpmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkRjPSExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWWQpKTsKdGhpcy5UYigpO2UuRmMoay5UbSk7KGE9ZS5DYih0aGlzLndkKCkpKXx8KGE9ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sU2w6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9aWYoIWEuZW5hYmxlZHx8IWEuZm9yY2VfZGlzYWJsZWQpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSwKdGhpcy5UYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnBhfWVsc2UgZD10aGlzLnBhO2lmKCEoZC5lbmFibGVkJiZkLnNlcnZlciYmZC5hbGlhcyYmZC5jb25maWcpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5nYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLkYoIndlYi5kZSIpfHxlLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8CmUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLkxjKCkpZm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5PYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuSmU9ZC5hZHBhdGh8fCIiO3RoaXMucmY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5UYigpKX0sTWM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEEodGhpcy5QYygpKSxkPXRoaXMudGEodGhpcy5PYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEEodGhpcy5PYit0aGlzLm9lKCJjdXN0b21lciIpKTt0aGlzLklhKGEsdGhpcy5hby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY3VzdG9tZXIiKTtiP3RoaXMuVGo/dGhpcy5kYSgibm9TVk1Db25maWciKToodGhpcy5Uaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGFvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuaWM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuVmM9dGhpcy5mYihkLnN0cmljdCk7dGhpcy5TZD10aGlzLmZiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkZnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy4kYT10aGlzLmZiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUGI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5SYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLlVjPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy5vYz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy4kYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlpiPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5mZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT0KZC5qc3BvcHVwc3x8ITE7dGhpcy50Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5WYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuVmI7dGhpcy56Zj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmpkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5OZj1kLnZtYXBzfHwiIjt0aGlzLnpjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmllPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLk9kPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuaWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmljPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMucG8oKSYmKHRoaXMuUGJ8fHRoaXMuUmJ8fHRoaXMuUWJ8fHRoaXMuVWMpP3RoaXMubmY/KHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuVGIoKSk6CnRoaXMuZm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GZigpKX19LGZvOmZ1bmN0aW9uKCl7dGhpcy5lbygpO3RoaXMuaG8oKX0saG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksCkY9ZS5YKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihGLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoRikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwplLnpiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUucWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxGZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuVGIoKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGIpKSx0aGlzLlRiKCksdGhpcy50ZSgpKX0sZW86ZnVuY3Rpb24oKXtpZih0aGlzLlBiKXt2YXIgYj1lLnFkKCk7aWYoKGIuaXNDaHJvbWV8fGIuaXNGaXJlZm94KSYmdGhpcy5tbSgpKXRoaXMuTmQodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUGIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5QYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwpiPWR9Y2F0Y2goZil7fWI/dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5jaSgpfX1lbHNlIHRoaXMuY2koKX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy5rbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuWmguYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWZ1bmN0aW9uIGEoKXt0aGlzLk5kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5RYj10aGlzLlVjKSYmdGhpcy5RYi5sZW5ndGgpe3ZhciBkPXRoaXMuUWIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5aaCgpfSxrbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IEEoYiksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLmJpLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBhKCl7dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlJiJiZ0aGlzLlJiLmxlbmd0aCl7dmFyIGQ9dGhpcy5SYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmJpKCl9LGxvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwKITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihhLGQpe2Q9PWImJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sWmg6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLnlkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMuZmIoYi5jYyk7dGhpcy5GZigpfS5iaW5kKHRoaXMpLHRoaXMuJGguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy4kaCgpfWVsc2UgdGhpcy5GZigpfSwKJGg6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKTt0aGlzLlRiKCk7dGhpcy50ZSgpfSxtbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChiKXtyZXR1cm4iZmFpbCJ9fSxUYjpmdW5jdGlvbigpe3ZhciBiPSIwIixhPSIwIjt0cnl7ZS5TYSgpJiYoYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQWIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlpkKSk7dGhpcy5VZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVkJiZ0aGlzLlVkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkFifSl9LApRazpmdW5jdGlvbigpe2lmKHRoaXMuU2QmJnRoaXMuVmwoKSl7dmFyIGI9dGhpcy5EbCgpO2ImJmIuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYi5qb2luKCJfIiksITApfX0sZ2k6ZnVuY3Rpb24oYil7Ynx8KGI9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGIpdHJ5e2I9Yi50b1N0cmluZygpfWNhdGNoKGEpe2I9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9Yj1iLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITApfSxJYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy52ZHx8KHRoaXMudmQ9MCk7dGhpcy52ZCsrO3RoaXMudmQ+dGhpcy5laCYmIXRoaXMuZmgmJih0aGlzLmZoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5laCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi51aT0hMCk7YyYmZS5rbSgpJiYoYi5QZz0hMCk7aCYmKGIuWWg9ITApO3JldHVybiBiLmxvYWQoKX0sTms6ZnVuY3Rpb24oKXtlLlNhKCl8fAplLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmRhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMudGEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5kYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sY286ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuTmZ9LE9rOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKITApO3ZhciBiPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2IuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYix0aGlzLkVvLmJpbmQodGhpcyksdGhpcy5Eby5iaW5kKHRoaXMpKX0sRW86ZnVuY3Rpb24oYil7dmFyIGE9bnVsbCxkPW51bGw7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLm1sKCl9LERvOmZ1bmN0aW9uKCl7fSxtbDpmdW5jdGlvbigpe2UuRmMoay5sbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sCnRlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMudGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy50Yi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLnRiW2JdOyJyZXF1ZXN0Ij09YS50eXBlJiZlLmFiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09YS50eXBlKXt2YXIgZD1uZXcgSDt3aW5kb3dbZC5mYSgpXT10aGlzO2UuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKGIpe2lmKGIucmVzcG9uc2VUZXh0KXRyeXtldmFsKGIucmVzcG9uc2VUZXh0KX1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0scG86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5PZH0sTGI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0KIiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9LHpiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsYyxlLGgsayxsPTA7bDxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQobCsrKSxmPWIuY2hhckNvZGVBdChsKyspLGM9Yi5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxoPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBhfSx0YTpmdW5jdGlvbihhKXt2YXIgZz0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtnW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZ1sxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSxUaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBnKGEpe3ZhciBiPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9YT4+PjQqZCYxNSxiKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspaFtjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWhbY109ZChoW2MtM11eaFtjLThdXmhbYy0xNF1eaFtjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditoW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditoW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGcoaykrZyhsKStnKG0pK2cocikrZyh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLG09bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuYXA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLmFwfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmJiPWEuYy5SKCk6dGhpcy5iYj0iIjthLmMubWgmJmEuYy5taCh7cGF1c2U6dGhpcy5CZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlFoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmFmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMud28uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5rYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmVjPXRoaXMuZ2Q9ITE7dGhpcy5Daz0xRTM7dGhpcy5yYT1udWxsO3RoaXMuQj1nO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLktkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLkdrPWUuWCgxMCk7CnRoaXMuQmY9MDt0aGlzLmRkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZGQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZGQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQWs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5lZj10aGlzLkpkPSExO3RoaXMudmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLm5lPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5qYz0hMTt0aGlzLiRrPWUuWCgxMCk7dGhpcy5LYj1lLlgoMTApO3RoaXMuSWI9ZS5YKDEwKTt0aGlzLlVoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuVmQ9CnRoaXMuVWI9dGhpcy52ZT10aGlzLm5kPXRoaXMuTGQ9dGhpcy51Yj10aGlzLnFjPXRoaXMuRGg9dGhpcy5zZD10aGlzLnFvPXRoaXMueGI9dGhpcy5KYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5SbT0yMDA7dGhpcy5RZj10aGlzLldjPXRoaXMucmU9dGhpcy5QZj10aGlzLm1mPSExO3RoaXMuY2Y9e319Yy5haj1hO2EucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBnfSxoaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5HYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuVW4oKTtlLm8oay5yayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXZTpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLnhiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkIuUyl0aGlzLkJmKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5CLlFrKCksYz1tLmdldENvbmZpZygpLGUueGUmJih0aGlzLkIueW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQi5IYSYmdGhpcy5CLmlzRW5hYmxlZD8odGhpcy5oaSgpLG5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQi5WYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLmhpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5CLlZiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBrPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2suV2UoYSxnLGQpfSw1MCl9fSxoZjpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuVmQ9dGhpcy5VYj10aGlzLnNkPSExO3RoaXMuYj1hO3RoaXMuTm4odGhpcy5iKTt0aGlzLmFoKGEpO3RoaXMudmM9dGhpcy5SZyhhKTt0aGlzLlZrKCl9LGFoOmZ1bmN0aW9uKGIpe2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mCmEmJih0aGlzLktkPXRoaXMuT2woYikpLHRoaXMuYWgoYi5wYXJlbnQpKX0sUmc6ZnVuY3Rpb24oYil7dmFyIGM9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoYz10aGlzLlJnKGIucGFyZW50KSksYy5wdXNoKHRoaXMueGwoYikpKTtyZXR1cm4gY30seGw6ZnVuY3Rpb24oYSl7dmFyIGM9IiIsZD1bXTtpZihhJiZhLkomJmEuSi5nZXRBdHRyaWJ1dGUpe2M9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylkLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpjLGNyZWF0aXZlSUQ6ZH19LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5KKXtjPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpOwpmPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKylkLnB1c2goYS5sYihjW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmh9fSxxYTpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGM9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJgooYz1hLmVycm9yLmRldGFpbC5jb2RlKSxhLnBkJiZhLnBkLmVycm9yJiZhLnBkLmVycm9yLmNvZGUmJihjPWEucGQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5ZYy5jb2RlOmM9PUQuY2UuY29kZT9lLm8oay5abyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOihlLlhlKCksYz09RC5VZi5jb2RlJiZlLm8oay5MbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKTtlLm8oay5rbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVm4oKTt0aGlzLlVhKCJlbXB0eSIpO3RoaXMuQi5BYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkFiLCEwKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Gbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LlZmLmNvZGU6ZS5vKGsuJG8sCnRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUubyhrLk1tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUubyhrLkJvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUubyhrLkNvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuVWEoInVua25vd24iKX10aGlzLmZjKGEpO3RoaXMuUGEoKX0sZmM6ZnVuY3Rpb24oYSl7dmFyIGM9CjkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihjPWEuZXJyb3IuY29kZSw5MDE8YyYmKGM9OTAwKSk7Zm9yKGM9eyJbRVJST1JDT0RFXSI6Y307YS5NYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk1hLnBvcCgpO3RoaXMuVmUoZC51cmwsZC50eXBlLGMpfWNhdGNoKGYpe319LE5uOmZ1bmN0aW9uKGEpe3RoaXMudmU9ITE7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dmFyIGM9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYz10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuZ2IuekluZGV4PWM7Yz10aGlzLmEuQTt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksZj0iIjtkJiZkLmVudnZhcnMmJihmPWQuZW52dmFycygpKTtmLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLmdldEVudmlyb25tZW50VmFyaWFibGVzJiYoZj1kLmdldEVudmlyb25tZW50VmFyaWFibGVzKCkpOwpmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5tZj0hMCl9Y2F0Y2goaCl7fWMuY3E9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGMuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihjLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZjLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLkFrJiZ0aGlzLnBsYXllci5DZSgpJiYoYy52b2x1bWU9dGhpcy5wbGF5ZXIuQ2UoKS8xMDApO2Zvcig7Yy5maXJzdENoaWxkOyljLnJlbW92ZUNoaWxkKGMuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPAphLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy52ayhjLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMubWYmJmMubG9hZCgpO2lmKHRoaXMuZGkoYykpe3RoaXMuVmgoInNldHVwIix0aGlzLldhKCkpO3RoaXMueWsoYyk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLm1mP3RoaXMudmlkZW89Yzp0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyl9Y2F0Y2gobCl7dGhpcy52aWRlbz1jfX1lbHNlIHRoaXMuYi5XaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChjKSx0aGlzLkxuKCkpOnRoaXMuYi5vcmlnaW4uSGcody4kZCl9LExuOmZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnViPXRoaXMucWM9ITE7dGhpcy5hLmMuc2EmJnRoaXMuYS5jLnNhKCkmJihlLm8oay55Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudWI9ITApO2UudWUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4ubWEmJmUuemsodGhpcy5iLm9yaWdpbi5tYSk7dGhpcy5WaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS5FaCgpO3RoaXMuYS55ZigpO2ZvcihhPQp0aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5hLnlmKCk7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy5yYT10aGlzLmEuSTt0aGlzLm5pKCJ2cGFpZCIpO2lmKHRoaXMudWIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5OYigibXV0ZWQiLCJjb250ZW50Iik7ZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX10aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsCiJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5hLkkuYXBwZW5kQ2hpbGQodGhpcy5DKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUueGYodGhpcy5DLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5DLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLlJsKCksYz10aGlzLmIudS5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsCiJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLm1nKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5CKTt0aGlzLkMuc3JjPWE7ZS5wZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEuaGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ObyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLk9vKCksdGhpcy5hLmhjKCEwKSwhdGhpcy5VYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy5DLApjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmhjKCEwKSx0aGlzLlNvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5XbygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhvKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlRvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5kYyk7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goYyl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLmxlLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuUG8oKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5XYyYmKHRoaXMuUWY9ITEsdGhpcy5uYygpKSx0aGlzLlFvKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLk5iKCJtdXRlZCIsInVzZXIiKSxlLm8oay56ZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSGYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLnBlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe2UuaWEodGhpcy5DLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sUG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLmplLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnFjPSEwfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmJkLHRoaXMuYi51LAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMucWM9ITF9LFNvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sUm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sT286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5XaCgpO2UubyhrLmJnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2UubyhrLmJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuc2Q9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLlpmLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5WYSgibWlkcG9pbnQiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsuaGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLktmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sc2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5DJiZ0aGlzLkMucGFyZW50Tm9kZSYmdGhpcy5DLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGM9dGhpcy5DLnBhcmVudE5vZGU7dGhpcy5DLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DKTtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyk7CmUudWUoKTt0aGlzLkM9ITE7dGhpcy5QYShhKX19LE5vOmZ1bmN0aW9uKGEpe3ZhciBjPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWMmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGM9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGMubWF0Y2goZCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLm8oay5Zbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuc2koITApfSx2azpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkhhJiZiLmlzRW5hYmxlZCYmIWIuTGMoKSl7dmFyIGM9Yi50YShhKTtyZXR1cm4gYy5wcm90b2NvbCsiOi8vIitjLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9ZChjLHRoaXMuQik7Zi5vbmVycm9yPXRoaXMuS28uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoYyx0aGlzLkIpKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LHlrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm9pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMub2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5NZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sb2k6ZnVuY3Rpb24oYSl7dGhpcy5lY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjfHx0aGlzLk1mKGEpfS5iaW5kKHRoaXMpLHRoaXMuQ2spKX0sTWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2QmJnRoaXMuZGkodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5lYyl7dGhpcy5nZD0hMDt0cnl7aWYoIWUuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRmQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5XYSgpLCEwKSx0aGlzLkIuRmd8fHRoaXMuQi5kYSgidmlkZW8tbm9vcCIpKTt0aGlzLlBhKCk7cmV0dXJufX1jYXRjaChjKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5XYSgpLCEwKX10aGlzLkhvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEueWYoKTt0aGlzLkdvKCk7dGhpcy5uaSgpO3RoaXMubmcoKTt0aGlzLmEuRWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuQ2YoKX19LENmOmZ1bmN0aW9uKCl7dGhpcy5uZHx8dGhpcy4kZigpfSwkZjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZpZGVvLnBsYXkoKTtpZihjJiZjWyJjYXRjaCJdKWNbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLm5kfHwoYT90aGlzLlBhKCk6KHRoaXMuYWYoITApLHRoaXMuJGYoITApKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYy5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfS5iaW5kKHRoaXMpO3RoaXMuRWUoKS5TaCh0aGlzKX0sS2Y6ZnVuY3Rpb24oKXt0aGlzLkIuJGEmJiF0aGlzLkpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5vKGsucGssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlBhKCl9LHNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkPSExLGY9MDtmPGEubGVuZ3RoO2YrKylkPWUuV2coYVtmXSksYy5wdXNoKGQpO2E9e2hhc2hlczpjfTthPWsuUmEoYSx0aGlzLnMoKSk7ZS5TbihhKX0sUGE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuV2QmJnRoaXMuc2sodGhpcy5iLldkKTsKaWYoIXRoaXMudmUpaWYodGhpcy52ZT0hMCx0aGlzLlZkfHwoZS5vKGsuT20sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmIud2J8fHRoaXMuYi50Yyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5CZisrO3RoaXMuZWM9dGhpcy5nZD0hMTt0cnl7dGhpcy5GZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMucmEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSmQ9ITE7dHJ5e3RoaXMuYS5saSgpfWNhdGNoKGgpe310aGlzLkxkPSEwO3RoaXMuYS5JZSgpO3RoaXMuamM9ITE7dGhpcy5FZSgpLk9oKCk7dGhpcy5iLndiJiZ0aGlzLmIub3JpZ2luLmJmKCk7dGhpcy5iLnRjJiYoYT90aGlzLmIub3JpZ2luLnloKCk6dGhpcy53ZSgpKX1lbHNlIHRoaXMud2UoKX0sCktvOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRmQodGhpcy52aWRlbyksdGhpcy5MZihhKSl9LExmOmZ1bmN0aW9uKGEpe3RoaXMuZWM9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5CLk5rKCk7dGhpcy5iLm9yaWdpbi5IZyh3LiRkKX0scGk6ZnVuY3Rpb24oKXtpZih0aGlzLnFvKXRoaXMuUGEoKTtlbHNle3RoaXMuamM9ITA7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMudW8oYSk7aWYoIXRoaXMuVWIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpjLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9ZD0iIjt0aGlzLmIuQWYmJihjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVWgpKSYmKGQ9dGhpcy5iLkFmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5KZHx8KHRoaXMuSmQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLmIud2I/KHRoaXMuZWM9dGhpcy5nZD0hMSx0aGlzLkZkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSmQ9ITEsdGhpcy5hLmxpKCksdGhpcy5iLm9yaWdpbi5iZigpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLm5lPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saWk6ZnVuY3Rpb24oKXt0aGlzLkRofHwodGhpcy5EaD0hMCx0aGlzLnNkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sdW86ZnVuY3Rpb24oYSl7ZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthPT10aGlzLmppfHx0aGlzLkpifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fAp0aGlzLldoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkIuJGEmJnRoaXMuVmEoInN0YXJ0IiksZS5vKGsuYmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSxlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnNkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS5vKGsuWmYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUubyhrLmhnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLHRoaXMuamk9YSl9LFZoOmZ1bmN0aW9uKGEsYyl7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGMsITApfSxVbjpmdW5jdGlvbigpe2UuUWQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sV2g6ZnVuY3Rpb24oKXtlLlFkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFZuOmZ1bmN0aW9uKCl7ZS5RZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlFkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFZhOmZ1bmN0aW9uKGEpeyh0aGlzLlBmfHx0aGlzLkIuJGEpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5XYSgpLCEwKX0sTmI6ZnVuY3Rpb24oYSxjKXt0aGlzLkIuJGEmJmUudHJhY2soInN0YXRzX2hkXyIrYSxjLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxjKXtpZighdGhpcy5KYil7dGhpcy5jZiYmdGhpcy5jZi50cmFjayYmdGhpcy5jZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmUueGUmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPQohMH12YXIgZD1bXTt0cnl7ZD10aGlzLlBsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMucmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5LZC5pbXByZXNzaW9ucyYmZS5pbShoLnVybCx0aGlzLktkLmltcHJlc3Npb25zKT90aGlzLlZlKGgudXJsLGgudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLm8oay5xayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCkse2FkSWQ6dGhpcy5LZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5zKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuVmUoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWMpdHJ5e3RoaXMuYi5NYT10aGlzLmNsKHRoaXMuYi5NYSxhKX1jYXRjaChtKXt9fX0sV2E6ZnVuY3Rpb24oKXt2YXIgYT1lLlNhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLApjPSIiO3RoaXMuUGYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFZlOmZ1bmN0aW9uKGEsYyxkLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGM9dGhpcy5CLnZhKGEpLGQmJmMudWsoZCksZnx8KGY9dGhpcy5FZyksZXx8KGU9dGhpcy5FZyksdGhpcy53ayhhKSx0aGlzLkIuSWEoYyxmdW5jdGlvbigpe3RoaXMuTmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sd2s6ZnVuY3Rpb24oYSl7dGhpcy5sY1thXT0ib3BlbiJ9LE5oOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09ImNsb3NlZCJ9LFZrOmZ1bmN0aW9uKCl7dGhpcy5sYz17fX0sWG46ZnVuY3Rpb24oKXt2YXIgYT0wLGM7Zm9yKGMgaW4gdGhpcy5sYyl0aGlzLmxjLmhhc093blByb3BlcnR5KGMpJiYib3BlbiI9PXRoaXMubGNbY10mJmErKztyZXR1cm4gYX0sUGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09CmN9KX0sY2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWN9KX0sSG86ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLklvLmJpbmQodGhpcykpfSxJbzpmdW5jdGlvbigpe2UuU2EoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMubmMoKTp0aGlzLmIuZGMmJihlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt0cnl7dmFyIGM9d2luZG93Lm9wZW4oIiIsYSk7Yy5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZj0KdGhpcy5iLmRjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5kYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LEdvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0KImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5CLmpkJiYoYz10aGlzLkIuamQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGIuYmluZCh0aGlzKSwxRTMqYyk7dGhpcy5jYXB0aW9uPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSl9fSxEYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxIZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oYSl7aWYoIWUuRGYodGhpcy5jb250cm9scykpe3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy4kazt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5LYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5laS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGguc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixoLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuSWI7aC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9oLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnNvLmJpbmQodGhpcykpOmguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucm8uYmluZCh0aGlzKSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSGQoKX0uYmluZCh0aGlzKSk7CmguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuQWYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuU2EoKXx8KHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkhkKCl9LmJpbmQodGhpcykpLHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChkKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsCmMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMueGEmJih0aGlzLnhhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApjLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsueWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLmFmKCkpO3RoaXMuRWIoKX19LEViOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbmM6ZnVuY3Rpb24oKXsiaGlkZGVuIj09dGhpcy5jb250cm9scy5zdHlsZS52aXNpYmlsaXR5fHx0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuUWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkPwoodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSl9LGZpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5xYz8oZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMucWM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZHx8KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWQmJih0aGlzLmEuQS5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsCiEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0scm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZD8odGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5OYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy51Yj8oZS5pYSh0aGlzLkMsCiJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJtdXRlIiksdGhpcy51Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxhZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkfHwodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHdvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQmJih0aGlzLmEuQS5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksdGhpcy5OYigidW5tdXRlZCIsImNvbnRlbnQiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sbWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMpO3RoaXMubmR8fHRoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMucm0oKSYmdGhpcy5xbSgpJiYodGhpcy5CLnNjfHwic3BpZWdlbC5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYicHJlcm9sbCI9PWUuR2ImJnRoaXMudm8oKXx8KHRoaXMubmQ9ITAsdGhpcy54YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54YiksdGhpcy54Yj0hMSksdGhpcy56ZygpKX0scm06ZnVuY3Rpb24oKXt2YXIgYT0KZS5xZCgpO3JldHVybiB0aGlzLkIuVmImJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0scW06ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciIT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5lZnx8KGE9ITAsYy5hZEZhbGxiYWNrVVJMfHwoYy5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3JldHVybihhfHwhdGhpcy5yZSYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuZWZ9LEVsOmZ1bmN0aW9uKCl7dmFyIGE9bS5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpO3JldHVybiBhfSx2bzpmdW5jdGlvbigpe20uZ2V0Q29uZmlnKCk7CnRoaXMuZWY9dGhpcy5XYz10aGlzLlFmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLldhKCksITApO3RoaXMucmU9ITA7dmFyIGE9dGhpcy5FbCgpLGE9ZS5tZyhhLHRoaXMuQiwhMSx7b25seVVSTDohMH0pO2lmKCFhKXJldHVybiExO3RoaXMuV2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtyZXR1cm4hMH0semc6ZnVuY3Rpb24oYSl7dGhpcy5YbigpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemcoITApfS5iaW5kKHRoaXMpLHRoaXMuUm0pOih0aGlzLkxkPSEwLHRoaXMuYS5JZSgpLHRoaXMuYS51bigpLHRoaXMuamM9ITEsZS5vKGsuWmssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLkVlKCkuT2goKSl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYSgibWluVmlzIik7CmEmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5RaCgpOnRoaXMuQmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5kYyxhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi53Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnZjJiYwPHRoaXMudmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnZjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLkdrKyItIit0aGlzLkJmO3RoaXMuYiYmdGhpcy5iLlhnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPQp0aGlzLmIuWGcoKSk7cmV0dXJuIGF9LEVnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5hanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5DbXx8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5sYT1udWxsO3RoaXMuVj1bXTt0aGlzLko9bnVsbDt0aGlzLnVjPXRoaXMud2M9ITE7dGhpcy5tYT0iIjt0aGlzLk9mPSExO3RoaXMuaGg9IiI7ZCYmZC5lbXB0eT90aGlzLkFtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfQp2YXIgYj0wLGcsZD1bXTtjLmFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnFkKCksYjtiPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOm0udmEobS5NZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGUuRigibWFydGhhc3Rld2FydC5jb20iKXx8ZS5GKCJmYW5kb20uY29tIil8fGUuRigiZ2lnYS5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCkpe3ZhciBoPWUuQmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPT09CmguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihkKCl8fGcoKXx8aygpfHwiYXBwc3BvdCI9PWMpbCgpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uTWQoaCkpKyImdHlwZT1qcyIsYj1tLnZhKG0uTWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGUudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPW0udmEobS5NZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy56bS5iaW5kKHRoaXMpLHRoaXMud20uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLmxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5HYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuR2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkdifHx0aGlzLm9tKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLmNvKCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7CnZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09Zy5maXJzdENoaWxkO2MucHVzaChnKX1jYXRjaChoKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9tOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sCmM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sem06ZnVuY3Rpb24oYSl7dGhpcy5jbihhKTt0cnl7dGhpcy5sYT1hLnJlc3BvbnNlWE1MLHRoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj0KdGhpcy5TZygpO3RoaXMud2M9dGhpcy5FZigpO3RoaXMudWM9dGhpcy5haSgpO3RoaXMuaGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLk9jKCk7ZWxzZXt0aGlzLnFhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5PZj9ELmNlOkQuVGZ9KSk7dHJ5e2UudHJhY2soInN0YXRzX2hkX210eXVybCIsZS5DYih0aGlzLm1hKSwhMCl9Y2F0Y2goYyl7fX19LEFtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj10aGlzLlNnKCk7dGhpcy53Yz10aGlzLkVmKCk7dGhpcy51Yz10aGlzLmFpKCk7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuT2Y/RC5jZTpELlRmfSkpfSx3bTpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5RYSh3LlNmLHtkZXB0aDpifSkpfSwKT2M6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy5zbSgpP3RoaXMubW8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5iaCgpLGcse0FkU3lzdGVtOnRoaXMud2woKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlFhKHcuVmYpKTooYj0wLHRoaXMuem8oKSYmdGhpcy5oZih0aGlzLmJsKCkpKX0sYmY6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LmJmKCl9LHloOmZ1bmN0aW9uKCl7dGhpcy51Yz8odGhpcy51Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC55aCgpfSx6bzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpvKCk/dGhpcy5pbygpPyEwOigtMSE9dGhpcy5HYygpP3RoaXMucWEodGhpcy5RYSh3LlhkKSk6dGhpcy5xYSh0aGlzLlFhKHcuUmYpKSwhMSk6KHRoaXMucWEodGhpcy5RYSh3LlljLApELlVmKSksITEpfSxoZjpmdW5jdGlvbihhKXt0aGlzLm1hfHwodGhpcy5tYT0iIik7YS5XZHx8KGEuV2Q9W10pO2EuV2QucHVzaCh0aGlzLmhoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuWWUoKSk7YS53Yj1hLndiP2Eud2I6dGhpcy53YzthLnRjPWEudGM/YS50Yzp0aGlzLnVjO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZzt0aGlzLnBhcmVudC5oZihhKX0sYmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgUmE7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuZHVyYXRpb249dGhpcy5HYygpO2EuTT10aGlzLlpnKCk7YS5kYz10aGlzLnpsKCk7YS5rcT1bXTthLm9yaWdpbj10aGlzO2EudT10aGlzLnZsKCk7YS5BZj10aGlzLk5sKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8Cih0aGlzLm1hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuT2c7aWYoIXRoaXMuSiYmdGhpcy5sYSYmdGhpcy5sYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLmxhO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGM9ITE7KGM9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmYy5sZW5ndGgmJmUudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuTWE9YS5lcnJvci5jb2RlIT13LlhkLmNvZGU/YS5NYS5jb25jYXQodGhpcy5BbCgpKTphLk1hLmNvbmNhdCh0aGlzLkpsKCkpKTt0aGlzLlYubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYyYmdGhpcy5wYXJlbnQuZmMoYSksYj0wLHRoaXMuT2MoKSk6Cih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5xYSYmdGhpcy5wYXJlbnQucWEoYSksYj0wKX0sZmM6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZmMoYSl9LEhnOmZ1bmN0aW9uKGEsYil7dGhpcy5xYSh0aGlzLlFhKGEsYikpfSxRYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBTYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIGI8Z30sam86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlpnKCkubGVuZ3RofSxpbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuR2MoKX0sRWY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlYuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxhaTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuViYmMjw9dGhpcy5WLmxlbmd0aCYmCiF0aGlzLkVmKCkmJihhPSEwKTtyZXR1cm4gYX0sY246ZnVuY3Rpb24oYSl7dGhpcy5tYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm1hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubWE9IlVOS05PV04ifXRyeXt0aGlzLk9mPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSx3bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sWWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMub2goYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLm9oKGEucGFyZW50Tm9kZSk6ITF9LEpsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEFsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx6bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxPYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksRXA6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuT2F8fDFFMzt0cnl7dmFyIGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksYj1nLmNvbmNhdChlKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMudWQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sTmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5SbihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LERlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sR2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMudWQoYSk6IiJ9LHVkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLkdlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ha3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmxqfHxUYTtuZXcgVGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk1hPVtdO3RoaXMuTT1bXTt0aGlzLmRjPSIiO3RoaXMudT10aGlzLnRjPXRoaXMud2I9ITE7dGhpcy5LZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuTGU9IiJ9Yy5Kaj1hO2EucHJvdG90eXBlPXtXazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxIbDpmdW5jdGlvbigpe2lmKCF0aGlzLktlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubGEpe3ZhciBhPXRoaXMub3JpZ2luLmxhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGM9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1jLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLktlPWFbZF0pfXJldHVybiB0aGlzLktlfSxYZzpmdW5jdGlvbigpe2lmKHRoaXMuTGUpcmV0dXJuIHRoaXMuTGU7dmFyIGE9IiI7KGE9dGhpcy5IbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuTGU9YX0sUmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bY107cmV0dXJuIGF9fX0pKGMpO3ZhciBSYT1jLkpqfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkxpfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e2VlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLExhOiJYTUxfUEFSU0VfRVJST1IifSxSZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTGE6IkRVUkFUSU9OX0VSUk9SIn0sWWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLExhOiJFTVBUWV9WQVNUIn0sVmY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkxhOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxTZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixMYToiTE9BRF9FUlJPUiJ9LCRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixMYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LAplcDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixMYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTGE6IkRVTU1ZX0FEIn19LEQ9e1RmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTGE6Ik5PX0FEUyJ9LFVmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixMYToiTk9fTUVESUFGSUxFUyJ9LGZwOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLExhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sY2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlvPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFZhPWMueW98fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5lcnJvcj1hO3RoaXMucGQ9Yzt0aGlzLk1hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFNhPWMuT2l8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMuTml8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5QaD1hO3RoaXMudmlkZW89Yzt0aGlzLlRkPVtdO3RoaXMuTWg9W107dGhpcy5kZj1bXTt0aGlzLkpvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSygpfWMuZ3A9YTthLnByb3RvdHlwZT17SzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5QaC5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLlBoW2FdLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suWnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmhuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5UZC5wdXNoKHtzcmM6ZCxmcmFtZTpoLFNtOmUsdmVuZG9yOmMuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7Yzx0aGlzLmRmLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuZGZbY107ZC50eXBlPT09YSYmZC5Jayh0aGlzLkJsKGEpKX19LApCbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpcTohMCxocTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntWcDoidmlkZW8iLGxxOiJqc0N1c3RvbSIsbXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxucToxLEZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sClFsOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5UZC5sZW5ndGg7YysrKWlmKHRoaXMuVGRbY10udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5UZFtjXS5TbTtyZXR1cm4iIn0scm46ZnVuY3Rpb24oYSxjKXt0aGlzLk1oLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlFsKGMpLHZlbmRvcjpjfSk7dGhpcy5UbigpfSxobjpmdW5jdGlvbihhLGMpeyJ2aWRlbyI9PT1hP3RoaXMuSm8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMua2coYSxjKX0uYmluZCh0aGlzKSk6dGhpcy5rZyhhLGMpfSxrZzpmdW5jdGlvbihhLGMpe3RoaXMuZGYucHVzaCh7dHlwZTphLElrOmMsZnE6ITF9KX0sVG46ZnVuY3Rpb24oKXt0aGlzLk1oLm1hcChmdW5jdGlvbihhKXthLmxtfHwoYS5ZcCh7YWRTZXNzaW9uSWQ6ZS5YKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5qcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmxtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMudG18fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMua2I9YS5UZygpO3RoaXMuST1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkkuaWQ9ZS5YKDEwKTt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5OYT17fTt0aGlzLmxnPSExOwp0aGlzLmFjPVtdfWMuS2k9YTthLnByb3RvdHlwZT17dWw6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxlPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGU9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6ZSx5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy51bChhKTtmb3IodmFyIGM9MCxkPTAsZT0hMSxoPXRoaXMuWmwoYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMH0sbGk6ZnVuY3Rpb24oKXt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEVoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5jLmwoKSl9LHVuOmZ1bmN0aW9uKCl7dGhpcy5sZ3x8Cih0aGlzLmMucGxheSgpLGUubyhrLm1kLHRoaXMuYy5sKCkpKX0seWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSS5zdHlsZS56SW5kZXg9YTt0aGlzLkkuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5JLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkkuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkkuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTsKdGhpcy5jLlJjJiZ0aGlzLmMuUmMoKT90aGlzLmMuVGcoKS5hcHBlbmRDaGlsZCh0aGlzLkkpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5JKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxabDpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gZH0sc2w6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTtjLnBvc2l0aW9uP2MucG9zaXRpb249Yy5wb3NpdGlvbjpjLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy53aWR0aD1hLm9mZnNldFdpZHRoO2MuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gY30saGM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zbCh0aGlzLmtiKTtpZihjLnghPXRoaXMuTmEueHx8Yy55IT10aGlzLk5hLnl8fGMucG9zaXRpb24hPXRoaXMuTmEucG9zaXRpb258fGMud2lkdGghPXRoaXMuTmEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLk5hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk5hLndpZHRoJiYwPHRoaXMuTmEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5JZSgpO3JldHVybn10aGlzLk5hPWM7dGhpcy5jLlJjKCk/KHRoaXMuSS5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSS5zdHlsZS50b3A9IjBweCIpOih0aGlzLkkuc3R5bGUubGVmdD1jLngrInB4Iix0aGlzLkkuc3R5bGUudG9wPWMueSsicHgiKTt0aGlzLkkuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9Yy5oZWlnaHQrInB4Ijt0aGlzLkkuc3R5bGUucG9zaXRpb249Yy5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuYWMubGVuZ3RoO2ErKyl0aGlzLmFjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWUuRGYodGhpcy5JKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5hY3x8KHRoaXMuYWM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmFjLnB1c2goYSl9LEllOmZ1bmN0aW9uKCl7dGhpcy5JJiZ0aGlzLkkucGFyZW50Tm9kZSYmdGhpcy5JLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSSk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuS2l8fFlhLEI9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPQplLlgoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgJGE9Yy5UaXx8JGE7bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5HZChhKTt0aGlzLkNnKCl9LEdkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYWI9Yy5Eanx8YWI7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWNhKCk7dGhpcy5ZYj10aGlzLllifHwhMTt0aGlzLmNnPXRoaXMuZWc9CnRoaXMubGg9dGhpcy51YT10aGlzLkdmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLkdmPSEwO3RoaXMubGgmJnRoaXMudWcoKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmpjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMua2QoKTt0aGlzLmxoPSEwO3RoaXMudWcoKX0uYmluZCh0aGlzKSk7CnRoaXMucGcoKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5ZYil7dGhpcy5rZCgpO2lmKCF0aGlzLkdmJiYhdGhpcy5rZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuR2YmJnRoaXMuY2cmJiF0aGlzLmVnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LCRnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGIubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1iLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YSlyZXR1cm4gZC5pbnN0YW5jZX19LHBnOmZ1bmN0aW9uKCl7aWYodGhpcy5rZCgpKXt2YXIgYT0KdGhpcy4kZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLmVnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuY2c9YS5DcH10aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLlRwKCk6ITF9LEdjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5HYygpOi0xfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxxbDpmdW5jdGlvbihhLGIpe3RoaXMuWWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuWWJ8fDMwMj09dGhpcy5ZYj90aGlzLnVhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5ZYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksMTAwKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE/KHRoaXMudygpLHRoaXMub2EoKSk6YS5NZSgpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLktsKGEpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuQ2p8fGJiOyhmdW5jdGlvbihjKXtjLkVqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbm06ZnVuY3Rpb24oKXt3aW5kb3cuT08uTmoubmsubGs/d2luZG93Lk9PLk5qLm5rLmxrLkFwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWNhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkZlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBhYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgYmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIGNiPWMuRWp8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMub289YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBlYj1jLm9vfHxlYjtuZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLkhoKCl9LEhoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5VJiYoMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcyksMTAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0scmc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmcoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMucmcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5yZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuRWl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sS2g6ZnVuY3Rpb24oYSl7YT1uZXcgZmIoYSk7YS5qYT90aGlzLlAoKTp0aGlzLkwoYSl8fChhLkdkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk4oYSksKG5ldyBnYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLnJsfHwodGhpcy5ybD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuS2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLktoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGhiPWMuR2l8fGhiLFM9bmV3IGhiKHIpO1MuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGliPWMuaGx8fGliO25ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFQ9Yy5Xanx8VDsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LmNkKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguY2QoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5QbShhKX0uYmluZCh0aGlzKSk7eC5jZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKTt4LmNkKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5VbCgpfSxQbTpmdW5jdGlvbihhKXt2YXIgYj0iIixjO2ZvcihjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7Yj1pc05hTihhW2NdKT8hMTphW2NdO2lmKDEwMDk9PWFbY118fDEwMDE9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKXt0aGlzLncoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2NdKWlmKGFbY10uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbY11bZF0pPyExOmFbY11bZF0sMTAwOT09YVtjXVtkXXx8CjEwMDE9PWFbY11bZF18fDMwMz09YVtjXVtkXXx8NDAzPT1hW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkQoKX19KX0pKGMpO3ZhciBVPWMuVmp8fFU7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO3RoaXMuQWQmJihhPWUuZGwoYSx0aGlzLkFkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFQoZCk7aWYoIXRoaXMuTChkKSl7dGhpcy5OKGQpOwp2YXIgZj1uZXcgVShkLHRoaXMuRyk7Zi5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuQWR8fCh0aGlzLkFkPVtdKSx0aGlzLkFkLnB1c2goYVtiXSksZD1uZXcgVChoKSx0aGlzLkwoZCl8fCh0aGlzLk4oZCksZj1uZXcgVShkLHRoaXMuRyksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxjZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGMpfSxubzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLk5jfHwKKHRoaXMuTmM9W10pLHRoaXMuTmMucHVzaChhKSx0aGlzLnRuKCkmJih0aGlzLnBmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bY10mJjA8dGhpcy5hYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmFhW2JdW2NdLmxlbmd0aDtkKyspdGhpcy5hYVtiXVtjXVtkXShhKX19LFVsOmZ1bmN0aW9uKCl7aWYodGhpcy5OYylmb3IodmFyIGE9MDthPHRoaXMuTmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5OY1thXSxjPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbY11bZF0mJjA8dGhpcy5hYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmFhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5hYVtjXVtkXVtlXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4Lm5vKGEpfX0pfSkoYyk7dmFyIGpiPWMuWGp8fGpiLHg9bmV3IGpiKHIpO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2I9Yy5ibnx8a2I7bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sd2E6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBsYj1jLkJpfHxsYjsoZnVuY3Rpb24oYyl7Yy5DaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkQoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbWI9Yy5DaXx8Cm1iOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbGIoZCk7dGhpcy5MKGgpfHwodGhpcy5OKGgpLChuZXcgbWIoaCx0aGlzLkcpKS5mKCkpfWNhdGNoKGspe319dGhpcy5QKCl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihiPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYj1jLk1pfHxwYjtuZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLndnPXRoaXMuRWM9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dmFyIGI9dGhpcy5KZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuRWM9Yik7aWYoIXRoaXMud2cmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fAphLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixhLnNvdXJjZS5DSE9PU0VSX0FCfHwiIiwhMCk7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixjLCEwKTt0aGlzLndnPSEwfX19Y2F0Y2goaCl7fX0uYmluZCh0aGlzKSk7dGhpcy5WZygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuZ24odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSxWZzpmdW5jdGlvbigpe2lmKHRoaXMuRWMpcmV0dXJuIHRoaXMuRWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuSmcoYSkpcmV0dXJuIHRoaXMuRWM9CmF9fSxKZzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiZhLnZpZGVvU2xvdCYmKGI9YSk7YSYmYS5oZHZwYWlkJiYoYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZ246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiYKdGhpcy5lYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5tdXRlJiZ0aGlzLmVhLm11dGUoKX0uYmluZCh0aGlzKSk7YSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sbWg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy55anx8cWI7KGZ1bmN0aW9uKGMpe2MueGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLnRpJiYodGhpcy5nKCksdGhpcy50aT0hMCx0aGlzLmthKCkpOwpiLkdhKCkuYWRkRXZlbnRMaXN0ZW5lcihhLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuVmcoKT90aGlzLkQoKToodGhpcy55ZXx8KHRoaXMueWU9MSksdGhpcy55ZSsrLDEwMDx0aGlzLnllP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy54anx8cmI7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLkwoYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTsKdmFyIHNiPWMuemp8fHNiLFY9bmV3IHNiKHIpO1YuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5RbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRiPWMuUW18fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5VPygwLHRoaXMuVSkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZmt8fHViOyhmdW5jdGlvbihjKXtjLmVrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEljOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSwKYT1hLmdldFJhd1BsYXllcigpO3JldHVybiBhLmltYUFkc0xvYWRlcn0sZW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMub2EoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMuZ2V0UGxheWVyKCk7CnRoaXMuQmE/dGhpcy5lbih0aGlzLkJhKToodGhpcy5CYT10aGlzLkljKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuRCgpO3JldHVybn1pZighdGhpcy54Yyl7dGhpcy5EKCk7cmV0dXJufWE9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmViLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmViW2JdJiYzMDMhPXRoaXMuZWJbYl0mJjQwMyE9dGhpcy5lYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMub2EoKTtlbHNle3RoaXMuRCgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZWt8fHZiOyhmdW5jdGlvbihjKXtjLmdrPQp0LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlRhPS0xO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5MKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuZ2t8fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmJtfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuamY9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLldtKCl9LmJpbmQodGhpcyksNTAwKX0sV206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5VJiZ0aGlzLlUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksCmI9MDthLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYj1hLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuamYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuamYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXbjpmdW5jdGlvbigpe3RoaXMuamY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLlJqfHwKemI7KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnBjPTB9LGY6ZnVuY3Rpb24oKXt0aGlzLkVtPTEwO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5wY3x8KHRoaXMucGM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5nKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5wY3x8dGhpcy5wYysrLHRoaXMucGM8PXRoaXMuRW0/KHRoaXMucGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5XbigpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5Ranx8QWI7KGZ1bmN0aW9uKGMpe2MuU2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSwKdGhpcy5HKSkuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgQmI9Yy5Tanx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIERiPWMueG98fERiO25ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0iIjthLmN1cnJlbnRUaW1lJiYoYj1hLmN1cnJlbnRUaW1lKTtyZXR1cm4gYn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sS2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5VKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuUGp8fEViOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5HYSgpLGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZztiJiZiLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7YS5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5CYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMudW0oKTp0aGlzLnRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5nKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LFhrOmZ1bmN0aW9uKCl7dGhpcy5hZygpfHx0aGlzLmcoITApfSx1bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQmIoKTshYS5uYSYmYS5WJiZhLnpwJiZhLkJwJiYodGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZygpKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7YS5hZHNMb2FkZXI/YS5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2gpZm9yKHZhciBhPQpjLlpjLkJiKCksYj10aGlzLmdldFBsYXllcigpLkdhKCkuaWQsZT0wO2U8YS5sZW5ndGg7ZSsrKWFbZV0uaWQ9PWImJih0aGlzLkNoPWFbZV0pO3JldHVybiB0aGlzLkNofSxVcDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxnOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2E/dGhpcy5CYigpLmFkc0xvYWRlcj90aGlzLkQoITApOnRoaXMuRCgpOnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLk9qfHxGYjsoZnVuY3Rpb24oYyl7Yy5aYz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBrOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgRmIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Yy5aYy5CYigpO2lmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuUGsoYVtiXSk7dGhpcy5QKCl9fSk7Yy5aYy5CYj1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKGwmJmwucGxheWVyYXBpJiYoYT1sLnBsYXllcmFwaSgpKSYmYS5sZW5ndGgpcmV0dXJuIGE7dmFyIGE9W10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSwKYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCksYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kKTtpZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5aY3x8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuJGl8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnVqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RSYmKGE9YS5maXJzdENoaWxkKTtpZihhKXt0aGlzLlQoYSk7aWYoYS50YWdOYW1lKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1iP3RoaXMuVyhiKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxTcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYzpmdW5jdGlvbigpe3JldHVybiEwfSxHYTpmdW5jdGlvbigpe3ZhciBhO0U/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9CmMudWp8fFc7KGZ1bmN0aW9uKGMpe2MudGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMua2Y9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5rZj1hLmlkKTtFP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLmtmJiZjIT10aGlzLmtmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuJHApLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy50anx8WDsoZnVuY3Rpb24oYyl7Yy52aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRSlmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBXKGEpLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBYKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmphP3RoaXMucGYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEUsSmI9Yy52anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLlVtfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5ZaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLApjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlooKSk6dGhpcy5aKCk6dGhpcy5aKCk6dGhpcy5aKCl9LHduOmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxYcDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBNYj1jLllpfHxNYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5xZygpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMua2EoKX0uYmluZCh0aGlzKSl9LHFnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLkdldEFkRXJyb3JzQ2FjaGUoKSxjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5oYW5kbGVFcnJvcihiW2NdKTthLkNsZWFyQWRFcnJvcnNDYWNoZSgpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT0KYSl0aGlzLnFnKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuZygpKX19LGc6ZnVuY3Rpb24oYSl7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIE5iPWMuWGl8fE5iOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7YXx8KGE9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYSYmYS5HZXRBbGxQbGF5ZXJzJiYoYT1hLkdldEFsbFBsYXllcnMoKSkmJjA8YS5sZW5ndGgpZm9yKHZhciBiPQowO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTWIoYVtiXSk7Yy5qYXx8dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgTmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIE9iPWMuWml8fE9iLFBiPW5ldyBPYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYj1jLkltfHxRYjtuZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTsKYnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWigpfSxSZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sZm46ZnVuY3Rpb24oKXt0aGlzLlhjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWGN8fCh0aGlzLlhjPSEwLHRoaXMuUmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlhjJiYodGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlhjPSExKSx0aGlzLlJkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgUmI9Yy5qa3x8UmI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sTGg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxoLmJpbmQodGhpcyksMTApfSxiYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMub2s9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuZygpKToodGhpcy5va3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuZygpKX0sWWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuYmMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLllmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuTGgoKTt0aGlzLllmKCk7dGhpcy5qbigpfSxqbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmRuP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLmRuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuYmMoYSkpfX0pfSkoYyk7dmFyIFNiPWMuaWt8fFNiOyhmdW5jdGlvbihjKXtjLmtrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEuZm4oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgVGI9Yy5ra3x8VGIsVWI9bmV3IFRiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLmpsfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLkZoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLkptPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX1lbHNlIHRoaXMuWigpfSx3bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KbX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUGQoYSl9LmJpbmQodGhpcykpfSxQZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5GaCYmKHRoaXMuRmg9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLlpqfHxOOyhmdW5jdGlvbihjKXtjLllqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5CZSlpZih0aGlzLkhifHwKKHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuSm4oKTp0aGlzLmcoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuZygpOnRoaXMuZyghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkJlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuY2EoYSk7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5Zanx8TzsoZnVuY3Rpb24oYyl7Yy4kaj0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVGE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5wZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFdiPWMuJGp8fFdiLFhiPW5ldyBXYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYj1jLkVrfHxZYjtuZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnFqfHxZOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmloPTA7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmVkPSExO3RoaXMuSmg9ZS5MYigxMCk7dGhpcy5xaCgpfSxxaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnNiKCksITA7dGhpcy5paCsrO2lmKDEwPHRoaXMuaWgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuZyghMCk6dGhpcy5nKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5xaC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLnVhPQohMH0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgWj1jLnBqfHxaOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWSh3aW5kb3cucGxheWVyKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLnJqfHxaYiwkYj1uZXcgWmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy4kbHx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5WaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2coKX0sc2c6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBjYz1jLlVpfHwKY2M7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmphKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYz1jLldpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmM9Yy5Va3x8ZmM7bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLndpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy53aXx8Z2M7KGZ1bmN0aW9uKGMpe2Mudmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpO3RoaXMuc2UoKTt0aGlzLm9nKCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LENhOmZ1bmN0aW9uKCl7dGhpcy51YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sb2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5vYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9nLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuc2UuYmluZCh0aGlzKSwxMDApfSxzZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMudml8fGhjOyhmdW5jdGlvbihjKXtjLnhpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT0KbmV3IGdjKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgaGMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuUmEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlJhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMueGl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLm5sfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMucmg9dGhpcy50aD10aGlzLnNoPSExO3RoaXMuQ2Q9W107dGhpcy5vZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHphP251bGw6emEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgUz9udWxsOlMsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFViP251bGw6VWIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Maj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLkxsKGEpOltdLGM7dGhpcy50aD0hMDtpZihhLmxlbmd0aCl7dGhpcy5zaD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sCnRoaXMuUmgoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLm9mKXtpZih0aGlzLnJoKWJyZWFrO2M9dGhpcy5vZltkXTt0aGlzLkpmKGMpJiYodGhpcy5DZC5wdXNoKGMpLHRoaXMuUmgoYykpfX0sSmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxMbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZD1hW2VdLGQ9dGhpcy5vZltkXSx0aGlzLkpmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LFJoOmZ1bmN0aW9uKGEpe3RoaXMuSmYoYSkmJmEuZigpfSxZbjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuc2gpZm9yKHRoaXMucmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uU2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5TYil9fX0pKGMpO3ZhciBsYz1jLkxqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5nbHx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRmMoay5BbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsCmMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTt2YXIgRz1uZXcgSCxsPSExO0cuZmEoKTtHLm5oKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5mYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcubmgoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LAohMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuTmcod2luZG93LEcuZG0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5TaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy54ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTt0aGlzLkVkPTA7dGhpcy5JaD0hMTt0aGlzLmxmPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnlpPWE7YS5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3RoaXMuR2g9YX0sdmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmJiPXRoaXMucGxheWVyLlIoKX0sCmdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQW46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx6bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTsKdmFyIGQ9ITEsZj0hMTtpZih0aGlzLmVtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5wYSx0aGlzLm5iLm5mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMudm4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuJG4oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsaCk7bC54bih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuRG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5TaChsKX19LGVtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy54ZC5nZXRUaW1lKCksdGhpcy54ZD1hLDNFNTxjPyEwOiExO3RoaXMueGQ9YTtyZXR1cm4hMX0sUW46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS51ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLklnKGEpKT90aGlzLlNjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksCjApLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfSxQbjpmdW5jdGlvbihhKXtpZighdGhpcy5HaCl7ZS51ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuRm4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSWcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsubWQsdGhpcy5wbGF5ZXIubCgpKSl9fSxJZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sbW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Nbih0aGlzLlBuLmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5LYSgpfSxJZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS51ZigibWlkcm9sbCIpO2lmKCF0aGlzLndoKXt0aGlzLndoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfX0sbG46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Fbih0aGlzLklkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlplKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlFuKCk7dGhpcy5wbGF5ZXIuWmUmJnRoaXMubG4oKTt0aGlzLm1uKCl9LG5uOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkRkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5jcChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRWQ9dGhpcy5EZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkVkJiYoYT0hMCk7cmV0dXJuIGF9LHZuOmZ1bmN0aW9uKGEpe3RoaXMuSWg9YTtmb3IoYT0wO2E8dGhpcy5EZC5sZW5ndGg7YSsrKXRoaXMuRGRbYV1bImZ1bmN0aW9uIl0odGhpcy4kbS5iaW5kKHRoaXMpKX0sJG06ZnVuY3Rpb24oYSl7dGhpcy5FZC0tO2EmJnRoaXMubGYucHVzaChhKTswPj10aGlzLkVkJiZ0aGlzLkloKCl9LERtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLmxmLmxlbmd0aDtkKyspYz0KdGhpcy5sZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy55aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnBsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoZWVCaWNoYWhNaWFNZWVHaCxlZUJpY2hhaE1pYU1lZUdoKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.219.72.195
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 34FB
|
265 B
436 B
|
6ms
6ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
General
- Full URL
- https://videos.giga.de/homad/giga-ssl.json?cache=6924814971
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGVlQmljaGFoTWlhTWVlR2g9ZWVCaWNoYWhNaWFNZWVHaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZmZ8fCh4LmZmPTApO3guZmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5mZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5IayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2IudmYoYyk7Yi5BbihtKTtiLnpuKGwpO2Iubm4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Jbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS51aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5pbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGs9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlptLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5naD17fTt0aGlzLnNmPSExfWMuY2o9YTthLnByb3RvdHlwZT17Wm46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnNmfHwodGhpcy5zZj1lLlgoMTApKTtyZXR1cm4gdGhpcy5zZn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmdoW2JdJiYodGhpcy5naFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlpuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx6azpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sWm06ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuWW0oYi5kYXRhKX0sWW06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxCZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5XZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMueWQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxXZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx4azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnRsKGIpKXJldHVybjsoYT10aGlzLkJnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx0bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFVnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxLbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHhmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuYWwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuS24oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sSms6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGFsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5KayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxEZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxwaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFRoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGttOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scWQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAphbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxGajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxoazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQWkoKXx8Yi5IaSgpfHxiLmFtKCl8fGIuRmooKXx8Yi5oaygpfHxiLnNqKCl8fGIuVWooKX19O3JldHVybiBudWxsIT1iLkRrKCl9LHlsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxkbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxSbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxRZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMua2koYSkrIjoiK3RoaXMua2koTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGtpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx1ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE5nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxhbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk1sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sU246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLnZhKGIsITApO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS52YShmLCEwKTtmPW0udmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFFkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uT2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnVkKGIpOiIifSx1ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG1nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5wbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnFmJiZ3aW5kb3cuc2FuZGJveC5xZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLkxnKGIpKXJldHVybiB0aGlzLkxnKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS53ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy54ayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHlkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5bTpmdW5jdGlvbihiLGEsZCl7dGhpcy55ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx1aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMueW0oZi53ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGNwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxGazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0saW06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmJqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWm89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5rbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmJwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuZ2c9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuWmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5kZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5oZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EucGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuYmc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Gbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS4kbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLlprPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5tZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5mZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eucms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5iZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnFrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5yaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuemQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS55Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuWW89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQm89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Bbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLmZsfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxJbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnRkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudGQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG5oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5JbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnRkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmRqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuSWk9YX0pKGMpO3ZhciBLPWMuSWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Ca3x8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Laj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5CbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scGY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sR2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudGgmJkwuWW4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxqbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLktqfHx0OyhmdW5jdGlvbihjKXtjLk1qPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5EZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTW46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRW46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sR2Q6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnRrKCk7dGhpcy5HZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHRrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxTaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LE9oOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkRnfHwodGhpcy5EZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLk1qfHxxOyhmdW5jdGlvbihjKXtjLnppPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuV2Y9IjEiO3RoaXMuWGY9IjIiO3RoaXMubWs9IjMiO3RoaXMuJGM9MDt0aGlzLkZtPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5pZz10aGlzLm1pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMudmYoYSk7dGhpcy5DbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm1pfHwodGhpcy5taT0hMCxlLlhlKCkpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGNtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0sZ206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMud2YoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmNtKCk7aWYoIXRoaXMuZ20oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMud2YoKTtyZXR1cm59dGhpcy53ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuZ2koKTt0aGlzLmlnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy56YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGdpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldmfSx3ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWGZ9LEpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ta30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxhZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5XZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWGZ9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx2ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxHbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEJtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy56aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Canx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLnRvfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuS2coKTt0aGlzLk1nKCk7dGhpcy5Zaz0hMX0sS2c6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5JZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSWQoYil9LmJpbmQodGhpcykpfSxJZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5uanx8cmE7KGZ1bmN0aW9uKGMpe2MubWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5rZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgZz0wO2c8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7ZysrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbZ10udGFnKXt0aGlzLnliPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueWI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMueWI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0KImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPGQubGVuZ3RoO2crKylhLm9uKGRbZ10sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtnXSYmKHRoaXMuaGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtnXSYmdGhpcy5BaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkZtJiYhdGhpcy56YSgpJiYodGhpcy55Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLApmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLllrPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5CZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmFkLmluZGV4T2YoYikmJnRoaXMuYWQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmFkLmxlbmd0aD49dGhpcy5rZSYmdGhpcy5nKCkpfSwKQm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRGYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmhlfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuS2coKSxiLk1nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLm1qfHxzYTsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT0KdGhpcy5DbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKWEucHVzaChiW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpO3RoaXMuTChnKXx8dGhpcy5qbShnKXx8KHRoaXMuTihnKSxnPW5ldyBzYShnLHRoaXMuRyksZy5LKCksZy5mKCkpfX10aGlzLlAoKX19LEpwOmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LENsOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihhLmFuY2hvcil9fSl9KShjKTt2YXIgdGE9Yy5vanx8dGEsdWE9bmV3IHRhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuYm98fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmNrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEpe3ZhciBiPWEuZWxfO2J8fChiPWEuZWwoKSk7Yj8odGhpcy5UKGIpLChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYSl7dGhpcy5QZChhKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFiWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuYXV0b3BsYXk/YS5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHdhPWMuY2t8fHdhOyhmdW5jdGlvbihjKXtjLmJrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5LYz10aGlzLkJhPXRoaXMuZWQ9ITE7dGhpcy5KaD1lLkxiKDEwKTt0aGlzLklmPSEwO3RoaXMueGM9dGhpcy5raD0hMTt0aGlzLkttKGEuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy56aCgpLHRoaXMuS2soKSx0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGEuViwiOyIsdHlwZW9mIGEuViwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYS5WP2EuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGEuVj90eXBlb2YgYS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYS5pbWEsIjsiLHR5cGVvZiBhLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGEuSCwiOyIsdHlwZW9mIGEuSCwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLmltYT9hLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5pbWEmJmEuaW1hLkVhP2EuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IixhLmltYSYmYS5pbWEuRWE/dHlwZW9mIGEuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5mZToKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixhLkg/YS5ILmZlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILmdlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZ2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/CnR5cGVvZiBhLkgubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5xZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuSmgpfSxIYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5pbWEzJiYodGhpcy5pbWE9YS5pbWEzKTtpZihhLmltYSl7dGhpcy5pbWE9YS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LEljOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmEpe3ZhciBhPXRoaXMuSGMoKTthJiYoYS5hZHNMb2FkZXImJih0aGlzLm5hPWEuYWRzTG9hZGVyKSxhLl9hZHNMb2FkZXImJih0aGlzLm5hPWEuX2Fkc0xvYWRlciksYS5nZXRBZHNMb2FkZXImJih0aGlzLm5hPWEuZ2V0QWRzTG9hZGVyKSxhLmNvbnRyb2xsZXImJmEuY29udHJvbGxlci5zZGtJbXBsJiZhLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm5hPWEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm5hfSxZZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGhtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuamgpe3ZhciBhPQp0aGlzLkhjKCksYj10aGlzLmZtKCk7d2luZG93LmltYSYmYSYmKGEuX2Fkc0xvYWRlcnx8YS5hZHNMb2FkZXJ8fGIpJiYodGhpcy5qaD0hMCl9cmV0dXJuIHRoaXMuamh9LGZtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5lZCYmYS5hZHMmJihhLmFkcy5zdGF0ZXx8YS5hZHMuX3N0YXRlKSYmKHRoaXMuZWQ9ITApO3JldHVybiB0aGlzLmVkfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWMoKTtpZihhKXt2YXIgYj0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rbigpfS5iaW5kKHRoaXMpKSwKYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxrbjpmdW5jdGlvbigpe3RoaXMueGM9ITA7dmFyIGE9dGhpcy5ZZygpO2lmKGF8fHRoaXMuemEoKSl7dmFyIGI9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5jYShiKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuU2EoKSYmKGQ9Ik1fIik7YS5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDsKaWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYi5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnljfHwodGhpcy5tKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5iYSgpLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LElwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5BZyYmYS5hZHMmJih0aGlzLkFnPWEuYWRzKTtyZXR1cm4gdGhpcy5BZ30sS2s6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7CnRoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLkFoKCl9LmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YSYmKChhPXRoaXMuWWcoKSkmJmEuZGVzdHJveT9hLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoKX0uYmluZCh0aGlzKSw1MCkpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcoKSYmMDxhLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5obSgpKXt2YXIgYj10aGlzLkhjKCksZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLncoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5raD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8KKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMua2g9ITA7YS5pc1BsYXlpbmcoKSYmMTA8YS5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDUwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sTGs6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpOwpyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGsoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIGUueGU/ITE6dGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXtpZih0aGlzLllsKCkpe3RoaXMudWE9ITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXRoaXMuSWY9ITEsZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsInNldCIsITApO3RoaXMuZyghMCl9ZWxzZSB0aGlzLnVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpfSxZbDpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPQohMTtlLnlkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2E9IWUuZmIoYi5jYyl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthPSExfSwhMCwhMCk7dmFyIGI9ZS55bCgpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUueGU9LTEhPWIuaW5kZXhPZigiZmlyZWZveCIpfHwtMSE9Yi5pbmRleE9mKCJzYWZhcmkiKXx8YX1yZXR1cm4hMX0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy56YSgpfHwoYXx8KHRoaXMuSWY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSWYsZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApUazpmdW5jdGlvbigpe3RoaXMuUnB8fCgxMDx0aGlzLkxvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuTG8rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5zbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxzbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Nbyl7dGhpcy5Nbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmEudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5kaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuWGgod2luZG93KTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl0cnl7Yj1ifHx0aGlzLlhoKGFbZ10pfWNhdGNoKGQpe310aGlzLlAoKX19LFhoOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTt2YXIgeWE9Yy5ka3x8eWEsemE9bmV3IHlhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Baj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEFhPWMuQWp8fEFhO25ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuZ2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTsKcmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5XKGEpOnRoaXMuWigpfSxWbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZiLGc9dGhpcy5oYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5qYyYmKDA8PWcuaW5kZXhPZihkKXx8Yi5CZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuZ2Y9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKd2E6ZnVuY3Rpb24oKXt0aGlzLmdmKys7aWYoMTA8dGhpcy5nZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgphJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7dmFyIEJhPWMuSGp8fEJhOyhmdW5jdGlvbihjKXtjLkdqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5IYisrLDE1PHRoaXMuSGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPQohMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpOwp2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm9sPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5vbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlZtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Hanx8Q2E7KGZ1bmN0aW9uKGMpe2MuSWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBCYShhW2JdKTtnLmphfHx0aGlzLkwoZyl8fCh0aGlzLk4oZyksKG5ldyBDYShnLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Janx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuVGx8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlVnKGEsImVsZW1lbnRJRCIpOwpzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLlhtPWEucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1hLndpZHRoO2cuc3R5bGUubWluV2lkdGg9YS53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5YbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5yZD1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMucmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnJkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sU2s6ZnVuY3Rpb24oKXtlLnBoKHRoaXMucmQpO2UuT2UodGhpcy5yZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5qanx8R2E7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaWp8fEhhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiYKbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5VZyhhLCJlbGVtZW50SUQiKTtpZihlLnBoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmtqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy53anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPQoiR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxEbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHVrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixnLGQsZil7dGhpcy5YYT1iO3RoaXMuUGc9dGhpcy51aT0hMTt0aGlzLkJoPWQ7dGhpcy5ZaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmCjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJm0mJm0uUmUodGhpcy5YYS51cmwpJiZtLlZjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5EbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiKwpkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlBnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0aGlzLmhiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5ZaD90aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy51aXx8KHRoaXMuaGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwKInJlcXVlc3RfZmFpbGVkIiwhMCk6bS5SZSh0aGlzLlhhLnVybCksdGhpcy5CaCYmdGhpcy5CaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9Yy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkRhPXRoaXMuYmU9ITF9Yy5KaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihiKXt0aGlzLmJlPWJ9LEduOmZ1bmN0aW9uKGIpe3RoaXMuRGE9Yn0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIiwicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIiwKdnA6IkFkU2tpcHBlZCIsd3A6IkFkU3RhcnRlZCIsbHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixtcDoiQWRJbXByZXNzaW9uIixpcDoiQWRDcmVhdGl2ZVZpZXciLHBwOiJBZFZpZGVvTWlkcG9pbnQiLHFwOiJBZFBhdXNlZCIsc3A6IkFkVmlkZW9TdGFydCIsdHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5iZSxhW2RdKX0scG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmFlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmFlKXRoaXMuRGEuYWUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuRGEsdGhpcy5EYS5hZVthXSk7dGhpcy5EYSYmdGhpcy5EYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYS5nZXRFcnJvcigpO2ImJmNvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsImdvdCBlcnJvciIsYil9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5iZSYmdGhpcy5xbigpO3RoaXMuRGEmJnRoaXMucG4oKX19fSkoYyk7dmFyIE1hPWMuSml8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IYT0hMTt0aGlzLiRiPSIiO3RoaXMuZmQ9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5HZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm5mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuWmQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7CnRoaXMuWWQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnZiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLldiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLlBiPSIiO3RoaXMuUWI9W107dGhpcy5SYj1bXTt0aGlzLlVjPVtdO3RoaXMub2M9IiI7dGhpcy5BYj0hMTt0aGlzLk9kPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaWM9ITE7dGhpcy52Zz10aGlzLlVkPW51bGw7dGhpcy56Zj10aGlzLlZiPXRoaXMuRmc9dGhpcy5TZD10aGlzLlZjPXRoaXMuaGQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnZkPTA7dGhpcy5maD0hMTt0aGlzLmVoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy4kYixhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlpiLGFkdGFncmVnZXg6dGhpcy5mZCxiaXRyYXRlOnRoaXMuT2EsanNwb3B1cHM6dGhpcy5UZSxzaWRlbG9hZHM6dGhpcy50YixkaXNhYmxldGVzdHM6dGhpcy5HZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLlNlLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnBhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuWmQsSE9NQURfQkxPQ0tFRDp0aGlzLllkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsCnRlc3RUYWdzWEhSOnRoaXMuVWMsdGVzdDNQQ29va2llOnRoaXMub2MsdGhyb3R0bGU6dGhpcy5PZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLmljLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudmcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5zYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuaGQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuVmMsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuU2QsY29uZmlnRmFpbHVyZXM6dGhpcy5aYSxzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5yZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLnpmLHZtYXBzOnRoaXMuTmYsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHluOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy4kYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLmpiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuWmI9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5mZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkdnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuU2U9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuSmM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5wYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9CmIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLlpkPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuWWQ9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMudmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5XYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMub2M9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLk9kPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmljPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLnZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuaGQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmCih0aGlzLlZjPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuU2Q9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLlphPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5yZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuemY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmCih0aGlzLk5mPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuemM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmllPWIuYWRGYWxsYmFja1VSTCl9LFZsOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09dHlwZW9mIHRoaXMuWmFbYV0mJjE9PXRoaXMuWmFbYV0mJihiPSEwKTtyZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYil7dGhpcy5aYVtiXT0hMH0sRGw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxNZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9ZS5GayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fAp0aGlzLlpifHx0aGlzLmZkKSYmKGg9dGhpcy5IbShoKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkZsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sUWU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKTGM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuZ2EmJnRoaXMuZ2EubGVuZ3RoJiYwPHRoaXMuZ2EubGVuZ3RoJiYoYT10aGlzLmdhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFJlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuUWUoYik7cmV0dXJuIGF9LEZsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwOwpyZXR1cm4ibm9uZSJ9LHdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2FbdGhpcy5yZl19LFBjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy53ZCgpLGE9dGhpcy5UaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSx4aDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxHbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPApoLmxlbmd0aDtGKyspe3ZhciBrPWhbRl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy54aChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZiloLnB1c2gobCsiPSIrZltsXSk7Zj1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMueGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxIbTpmdW5jdGlvbihiKXt0aGlzLiRiJiYoYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5HbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sUms6ZnVuY3Rpb24oKXt0aGlzLnlhJiYKdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLk1rKHRoaXMueWEuY2xpZW50QVBJcyl9LE1rOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmYS5IbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuR24oYi5wbGF5ZXIpO2EuZigpfX0saTpmdW5jdGlvbihiLGEsZCxmLGMsZSl7bT10aGlzO3RoaXMuU2U9ITA7dGhpcy5KYz1iO3RoaXMucGE9YTt0aGlzLm5mPWQ7dGhpcy5VZD1mO3RoaXMuRGM9Yzt0aGlzLnlhPWV8fHt9O3RoaXMuUmsoKTt0aGlzLnhtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnBhKXRoaXMudm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSwKcmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LHhtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLkpjK3RoaXMub2UoImdsb2JhbCIpKSx0aGlzLlNsLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnRmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuQWMoKX0uYmluZCh0aGlzKSwhMCl9LHZtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLnBhK3RoaXMub2UoImNsaWVudCIsLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoKIj8iKSsoImNhY2hlPSIrdGhpcy5MYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGRhOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhkKXt0aGlzLmhkPSEwO3ZhciBhPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChnKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpOwpmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkRjPSExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWWQpKTsKdGhpcy5UYigpO2UuRmMoay5UbSk7KGE9ZS5DYih0aGlzLndkKCkpKXx8KGE9ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sU2w6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9aWYoIWEuZW5hYmxlZHx8IWEuZm9yY2VfZGlzYWJsZWQpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSwKdGhpcy5UYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnBhfWVsc2UgZD10aGlzLnBhO2lmKCEoZC5lbmFibGVkJiZkLnNlcnZlciYmZC5hbGlhcyYmZC5jb25maWcpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5nYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLkYoIndlYi5kZSIpfHxlLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8CmUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLkxjKCkpZm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5PYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuSmU9ZC5hZHBhdGh8fCIiO3RoaXMucmY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5UYigpKX0sTWM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEEodGhpcy5QYygpKSxkPXRoaXMudGEodGhpcy5PYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEEodGhpcy5PYit0aGlzLm9lKCJjdXN0b21lciIpKTt0aGlzLklhKGEsdGhpcy5hby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY3VzdG9tZXIiKTtiP3RoaXMuVGo/dGhpcy5kYSgibm9TVk1Db25maWciKToodGhpcy5Uaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGFvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuaWM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuVmM9dGhpcy5mYihkLnN0cmljdCk7dGhpcy5TZD10aGlzLmZiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkZnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy4kYT10aGlzLmZiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUGI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5SYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLlVjPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy5vYz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy4kYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlpiPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5mZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT0KZC5qc3BvcHVwc3x8ITE7dGhpcy50Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5WYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuVmI7dGhpcy56Zj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmpkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5OZj1kLnZtYXBzfHwiIjt0aGlzLnpjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmllPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLk9kPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuaWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmljPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMucG8oKSYmKHRoaXMuUGJ8fHRoaXMuUmJ8fHRoaXMuUWJ8fHRoaXMuVWMpP3RoaXMubmY/KHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuVGIoKSk6CnRoaXMuZm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GZigpKX19LGZvOmZ1bmN0aW9uKCl7dGhpcy5lbygpO3RoaXMuaG8oKX0saG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksCkY9ZS5YKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihGLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoRikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwplLnpiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUucWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxGZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuVGIoKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGIpKSx0aGlzLlRiKCksdGhpcy50ZSgpKX0sZW86ZnVuY3Rpb24oKXtpZih0aGlzLlBiKXt2YXIgYj1lLnFkKCk7aWYoKGIuaXNDaHJvbWV8fGIuaXNGaXJlZm94KSYmdGhpcy5tbSgpKXRoaXMuTmQodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUGIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5QYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwpiPWR9Y2F0Y2goZil7fWI/dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5jaSgpfX1lbHNlIHRoaXMuY2koKX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy5rbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuWmguYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWZ1bmN0aW9uIGEoKXt0aGlzLk5kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5RYj10aGlzLlVjKSYmdGhpcy5RYi5sZW5ndGgpe3ZhciBkPXRoaXMuUWIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5aaCgpfSxrbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IEEoYiksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLmJpLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBhKCl7dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlJiJiZ0aGlzLlJiLmxlbmd0aCl7dmFyIGQ9dGhpcy5SYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmJpKCl9LGxvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwKITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihhLGQpe2Q9PWImJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sWmg6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLnlkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMuZmIoYi5jYyk7dGhpcy5GZigpfS5iaW5kKHRoaXMpLHRoaXMuJGguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy4kaCgpfWVsc2UgdGhpcy5GZigpfSwKJGg6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKTt0aGlzLlRiKCk7dGhpcy50ZSgpfSxtbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChiKXtyZXR1cm4iZmFpbCJ9fSxUYjpmdW5jdGlvbigpe3ZhciBiPSIwIixhPSIwIjt0cnl7ZS5TYSgpJiYoYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQWIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlpkKSk7dGhpcy5VZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVkJiZ0aGlzLlVkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkFifSl9LApRazpmdW5jdGlvbigpe2lmKHRoaXMuU2QmJnRoaXMuVmwoKSl7dmFyIGI9dGhpcy5EbCgpO2ImJmIuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYi5qb2luKCJfIiksITApfX0sZ2k6ZnVuY3Rpb24oYil7Ynx8KGI9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGIpdHJ5e2I9Yi50b1N0cmluZygpfWNhdGNoKGEpe2I9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9Yj1iLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITApfSxJYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy52ZHx8KHRoaXMudmQ9MCk7dGhpcy52ZCsrO3RoaXMudmQ+dGhpcy5laCYmIXRoaXMuZmgmJih0aGlzLmZoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5laCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi51aT0hMCk7YyYmZS5rbSgpJiYoYi5QZz0hMCk7aCYmKGIuWWg9ITApO3JldHVybiBiLmxvYWQoKX0sTms6ZnVuY3Rpb24oKXtlLlNhKCl8fAplLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmRhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMudGEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5kYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sY286ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuTmZ9LE9rOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKITApO3ZhciBiPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2IuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYix0aGlzLkVvLmJpbmQodGhpcyksdGhpcy5Eby5iaW5kKHRoaXMpKX0sRW86ZnVuY3Rpb24oYil7dmFyIGE9bnVsbCxkPW51bGw7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLm1sKCl9LERvOmZ1bmN0aW9uKCl7fSxtbDpmdW5jdGlvbigpe2UuRmMoay5sbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sCnRlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMudGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy50Yi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLnRiW2JdOyJyZXF1ZXN0Ij09YS50eXBlJiZlLmFiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09YS50eXBlKXt2YXIgZD1uZXcgSDt3aW5kb3dbZC5mYSgpXT10aGlzO2UuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKGIpe2lmKGIucmVzcG9uc2VUZXh0KXRyeXtldmFsKGIucmVzcG9uc2VUZXh0KX1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0scG86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5PZH0sTGI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0KIiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9LHpiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsYyxlLGgsayxsPTA7bDxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQobCsrKSxmPWIuY2hhckNvZGVBdChsKyspLGM9Yi5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxoPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBhfSx0YTpmdW5jdGlvbihhKXt2YXIgZz0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtnW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZ1sxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSxUaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBnKGEpe3ZhciBiPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9YT4+PjQqZCYxNSxiKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspaFtjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWhbY109ZChoW2MtM11eaFtjLThdXmhbYy0xNF1eaFtjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditoW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditoW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGcoaykrZyhsKStnKG0pK2cocikrZyh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLG09bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuYXA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLmFwfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmJiPWEuYy5SKCk6dGhpcy5iYj0iIjthLmMubWgmJmEuYy5taCh7cGF1c2U6dGhpcy5CZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlFoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmFmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMud28uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5rYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmVjPXRoaXMuZ2Q9ITE7dGhpcy5Daz0xRTM7dGhpcy5yYT1udWxsO3RoaXMuQj1nO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLktkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLkdrPWUuWCgxMCk7CnRoaXMuQmY9MDt0aGlzLmRkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZGQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZGQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQWs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5lZj10aGlzLkpkPSExO3RoaXMudmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLm5lPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5qYz0hMTt0aGlzLiRrPWUuWCgxMCk7dGhpcy5LYj1lLlgoMTApO3RoaXMuSWI9ZS5YKDEwKTt0aGlzLlVoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuVmQ9CnRoaXMuVWI9dGhpcy52ZT10aGlzLm5kPXRoaXMuTGQ9dGhpcy51Yj10aGlzLnFjPXRoaXMuRGg9dGhpcy5zZD10aGlzLnFvPXRoaXMueGI9dGhpcy5KYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5SbT0yMDA7dGhpcy5RZj10aGlzLldjPXRoaXMucmU9dGhpcy5QZj10aGlzLm1mPSExO3RoaXMuY2Y9e319Yy5haj1hO2EucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBnfSxoaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5HYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuVW4oKTtlLm8oay5yayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXZTpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLnhiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkIuUyl0aGlzLkJmKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5CLlFrKCksYz1tLmdldENvbmZpZygpLGUueGUmJih0aGlzLkIueW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQi5IYSYmdGhpcy5CLmlzRW5hYmxlZD8odGhpcy5oaSgpLG5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQi5WYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLmhpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5CLlZiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBrPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2suV2UoYSxnLGQpfSw1MCl9fSxoZjpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuVmQ9dGhpcy5VYj10aGlzLnNkPSExO3RoaXMuYj1hO3RoaXMuTm4odGhpcy5iKTt0aGlzLmFoKGEpO3RoaXMudmM9dGhpcy5SZyhhKTt0aGlzLlZrKCl9LGFoOmZ1bmN0aW9uKGIpe2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mCmEmJih0aGlzLktkPXRoaXMuT2woYikpLHRoaXMuYWgoYi5wYXJlbnQpKX0sUmc6ZnVuY3Rpb24oYil7dmFyIGM9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoYz10aGlzLlJnKGIucGFyZW50KSksYy5wdXNoKHRoaXMueGwoYikpKTtyZXR1cm4gY30seGw6ZnVuY3Rpb24oYSl7dmFyIGM9IiIsZD1bXTtpZihhJiZhLkomJmEuSi5nZXRBdHRyaWJ1dGUpe2M9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylkLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpjLGNyZWF0aXZlSUQ6ZH19LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5KKXtjPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpOwpmPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKylkLnB1c2goYS5sYihjW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmh9fSxxYTpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGM9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJgooYz1hLmVycm9yLmRldGFpbC5jb2RlKSxhLnBkJiZhLnBkLmVycm9yJiZhLnBkLmVycm9yLmNvZGUmJihjPWEucGQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5ZYy5jb2RlOmM9PUQuY2UuY29kZT9lLm8oay5abyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOihlLlhlKCksYz09RC5VZi5jb2RlJiZlLm8oay5MbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKTtlLm8oay5rbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVm4oKTt0aGlzLlVhKCJlbXB0eSIpO3RoaXMuQi5BYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkFiLCEwKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Gbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LlZmLmNvZGU6ZS5vKGsuJG8sCnRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUubyhrLk1tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUubyhrLkJvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUubyhrLkNvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuVWEoInVua25vd24iKX10aGlzLmZjKGEpO3RoaXMuUGEoKX0sZmM6ZnVuY3Rpb24oYSl7dmFyIGM9CjkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihjPWEuZXJyb3IuY29kZSw5MDE8YyYmKGM9OTAwKSk7Zm9yKGM9eyJbRVJST1JDT0RFXSI6Y307YS5NYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk1hLnBvcCgpO3RoaXMuVmUoZC51cmwsZC50eXBlLGMpfWNhdGNoKGYpe319LE5uOmZ1bmN0aW9uKGEpe3RoaXMudmU9ITE7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dmFyIGM9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYz10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuZ2IuekluZGV4PWM7Yz10aGlzLmEuQTt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksZj0iIjtkJiZkLmVudnZhcnMmJihmPWQuZW52dmFycygpKTtmLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLmdldEVudmlyb25tZW50VmFyaWFibGVzJiYoZj1kLmdldEVudmlyb25tZW50VmFyaWFibGVzKCkpOwpmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5tZj0hMCl9Y2F0Y2goaCl7fWMuY3E9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGMuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihjLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZjLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLkFrJiZ0aGlzLnBsYXllci5DZSgpJiYoYy52b2x1bWU9dGhpcy5wbGF5ZXIuQ2UoKS8xMDApO2Zvcig7Yy5maXJzdENoaWxkOyljLnJlbW92ZUNoaWxkKGMuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPAphLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy52ayhjLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMubWYmJmMubG9hZCgpO2lmKHRoaXMuZGkoYykpe3RoaXMuVmgoInNldHVwIix0aGlzLldhKCkpO3RoaXMueWsoYyk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLm1mP3RoaXMudmlkZW89Yzp0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyl9Y2F0Y2gobCl7dGhpcy52aWRlbz1jfX1lbHNlIHRoaXMuYi5XaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChjKSx0aGlzLkxuKCkpOnRoaXMuYi5vcmlnaW4uSGcody4kZCl9LExuOmZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnViPXRoaXMucWM9ITE7dGhpcy5hLmMuc2EmJnRoaXMuYS5jLnNhKCkmJihlLm8oay55Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudWI9ITApO2UudWUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4ubWEmJmUuemsodGhpcy5iLm9yaWdpbi5tYSk7dGhpcy5WaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS5FaCgpO3RoaXMuYS55ZigpO2ZvcihhPQp0aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5hLnlmKCk7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy5yYT10aGlzLmEuSTt0aGlzLm5pKCJ2cGFpZCIpO2lmKHRoaXMudWIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5OYigibXV0ZWQiLCJjb250ZW50Iik7ZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX10aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsCiJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5hLkkuYXBwZW5kQ2hpbGQodGhpcy5DKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUueGYodGhpcy5DLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5DLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLlJsKCksYz10aGlzLmIudS5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsCiJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLm1nKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5CKTt0aGlzLkMuc3JjPWE7ZS5wZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEuaGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ObyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLk9vKCksdGhpcy5hLmhjKCEwKSwhdGhpcy5VYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy5DLApjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmhjKCEwKSx0aGlzLlNvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5XbygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhvKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlRvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5kYyk7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goYyl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLmxlLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuUG8oKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5XYyYmKHRoaXMuUWY9ITEsdGhpcy5uYygpKSx0aGlzLlFvKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLk5iKCJtdXRlZCIsInVzZXIiKSxlLm8oay56ZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSGYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLnBlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe2UuaWEodGhpcy5DLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sUG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLmplLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnFjPSEwfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmJkLHRoaXMuYi51LAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMucWM9ITF9LFNvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sUm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sT286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5XaCgpO2UubyhrLmJnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2UubyhrLmJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuc2Q9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLlpmLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5WYSgibWlkcG9pbnQiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsuaGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLktmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sc2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5DJiZ0aGlzLkMucGFyZW50Tm9kZSYmdGhpcy5DLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGM9dGhpcy5DLnBhcmVudE5vZGU7dGhpcy5DLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DKTtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyk7CmUudWUoKTt0aGlzLkM9ITE7dGhpcy5QYShhKX19LE5vOmZ1bmN0aW9uKGEpe3ZhciBjPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWMmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGM9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGMubWF0Y2goZCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLm8oay5Zbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuc2koITApfSx2azpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkhhJiZiLmlzRW5hYmxlZCYmIWIuTGMoKSl7dmFyIGM9Yi50YShhKTtyZXR1cm4gYy5wcm90b2NvbCsiOi8vIitjLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9ZChjLHRoaXMuQik7Zi5vbmVycm9yPXRoaXMuS28uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoYyx0aGlzLkIpKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LHlrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm9pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMub2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5NZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sb2k6ZnVuY3Rpb24oYSl7dGhpcy5lY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjfHx0aGlzLk1mKGEpfS5iaW5kKHRoaXMpLHRoaXMuQ2spKX0sTWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2QmJnRoaXMuZGkodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5lYyl7dGhpcy5nZD0hMDt0cnl7aWYoIWUuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRmQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5XYSgpLCEwKSx0aGlzLkIuRmd8fHRoaXMuQi5kYSgidmlkZW8tbm9vcCIpKTt0aGlzLlBhKCk7cmV0dXJufX1jYXRjaChjKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5XYSgpLCEwKX10aGlzLkhvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEueWYoKTt0aGlzLkdvKCk7dGhpcy5uaSgpO3RoaXMubmcoKTt0aGlzLmEuRWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuQ2YoKX19LENmOmZ1bmN0aW9uKCl7dGhpcy5uZHx8dGhpcy4kZigpfSwkZjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZpZGVvLnBsYXkoKTtpZihjJiZjWyJjYXRjaCJdKWNbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLm5kfHwoYT90aGlzLlBhKCk6KHRoaXMuYWYoITApLHRoaXMuJGYoITApKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYy5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfS5iaW5kKHRoaXMpO3RoaXMuRWUoKS5TaCh0aGlzKX0sS2Y6ZnVuY3Rpb24oKXt0aGlzLkIuJGEmJiF0aGlzLkpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5vKGsucGssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlBhKCl9LHNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkPSExLGY9MDtmPGEubGVuZ3RoO2YrKylkPWUuV2coYVtmXSksYy5wdXNoKGQpO2E9e2hhc2hlczpjfTthPWsuUmEoYSx0aGlzLnMoKSk7ZS5TbihhKX0sUGE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuV2QmJnRoaXMuc2sodGhpcy5iLldkKTsKaWYoIXRoaXMudmUpaWYodGhpcy52ZT0hMCx0aGlzLlZkfHwoZS5vKGsuT20sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmIud2J8fHRoaXMuYi50Yyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5CZisrO3RoaXMuZWM9dGhpcy5nZD0hMTt0cnl7dGhpcy5GZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMucmEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSmQ9ITE7dHJ5e3RoaXMuYS5saSgpfWNhdGNoKGgpe310aGlzLkxkPSEwO3RoaXMuYS5JZSgpO3RoaXMuamM9ITE7dGhpcy5FZSgpLk9oKCk7dGhpcy5iLndiJiZ0aGlzLmIub3JpZ2luLmJmKCk7dGhpcy5iLnRjJiYoYT90aGlzLmIub3JpZ2luLnloKCk6dGhpcy53ZSgpKX1lbHNlIHRoaXMud2UoKX0sCktvOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRmQodGhpcy52aWRlbyksdGhpcy5MZihhKSl9LExmOmZ1bmN0aW9uKGEpe3RoaXMuZWM9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5CLk5rKCk7dGhpcy5iLm9yaWdpbi5IZyh3LiRkKX0scGk6ZnVuY3Rpb24oKXtpZih0aGlzLnFvKXRoaXMuUGEoKTtlbHNle3RoaXMuamM9ITA7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMudW8oYSk7aWYoIXRoaXMuVWIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpjLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9ZD0iIjt0aGlzLmIuQWYmJihjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVWgpKSYmKGQ9dGhpcy5iLkFmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5KZHx8KHRoaXMuSmQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLmIud2I/KHRoaXMuZWM9dGhpcy5nZD0hMSx0aGlzLkZkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSmQ9ITEsdGhpcy5hLmxpKCksdGhpcy5iLm9yaWdpbi5iZigpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLm5lPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saWk6ZnVuY3Rpb24oKXt0aGlzLkRofHwodGhpcy5EaD0hMCx0aGlzLnNkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sdW86ZnVuY3Rpb24oYSl7ZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthPT10aGlzLmppfHx0aGlzLkpifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fAp0aGlzLldoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkIuJGEmJnRoaXMuVmEoInN0YXJ0IiksZS5vKGsuYmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSxlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnNkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS5vKGsuWmYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUubyhrLmhnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLHRoaXMuamk9YSl9LFZoOmZ1bmN0aW9uKGEsYyl7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGMsITApfSxVbjpmdW5jdGlvbigpe2UuUWQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sV2g6ZnVuY3Rpb24oKXtlLlFkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFZuOmZ1bmN0aW9uKCl7ZS5RZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlFkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFZhOmZ1bmN0aW9uKGEpeyh0aGlzLlBmfHx0aGlzLkIuJGEpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5XYSgpLCEwKX0sTmI6ZnVuY3Rpb24oYSxjKXt0aGlzLkIuJGEmJmUudHJhY2soInN0YXRzX2hkXyIrYSxjLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxjKXtpZighdGhpcy5KYil7dGhpcy5jZiYmdGhpcy5jZi50cmFjayYmdGhpcy5jZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmUueGUmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPQohMH12YXIgZD1bXTt0cnl7ZD10aGlzLlBsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMucmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5LZC5pbXByZXNzaW9ucyYmZS5pbShoLnVybCx0aGlzLktkLmltcHJlc3Npb25zKT90aGlzLlZlKGgudXJsLGgudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLm8oay5xayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCkse2FkSWQ6dGhpcy5LZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5zKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuVmUoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWMpdHJ5e3RoaXMuYi5NYT10aGlzLmNsKHRoaXMuYi5NYSxhKX1jYXRjaChtKXt9fX0sV2E6ZnVuY3Rpb24oKXt2YXIgYT1lLlNhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLApjPSIiO3RoaXMuUGYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFZlOmZ1bmN0aW9uKGEsYyxkLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGM9dGhpcy5CLnZhKGEpLGQmJmMudWsoZCksZnx8KGY9dGhpcy5FZyksZXx8KGU9dGhpcy5FZyksdGhpcy53ayhhKSx0aGlzLkIuSWEoYyxmdW5jdGlvbigpe3RoaXMuTmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sd2s6ZnVuY3Rpb24oYSl7dGhpcy5sY1thXT0ib3BlbiJ9LE5oOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09ImNsb3NlZCJ9LFZrOmZ1bmN0aW9uKCl7dGhpcy5sYz17fX0sWG46ZnVuY3Rpb24oKXt2YXIgYT0wLGM7Zm9yKGMgaW4gdGhpcy5sYyl0aGlzLmxjLmhhc093blByb3BlcnR5KGMpJiYib3BlbiI9PXRoaXMubGNbY10mJmErKztyZXR1cm4gYX0sUGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09CmN9KX0sY2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWN9KX0sSG86ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLklvLmJpbmQodGhpcykpfSxJbzpmdW5jdGlvbigpe2UuU2EoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMubmMoKTp0aGlzLmIuZGMmJihlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt0cnl7dmFyIGM9d2luZG93Lm9wZW4oIiIsYSk7Yy5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZj0KdGhpcy5iLmRjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5kYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LEdvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0KImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5CLmpkJiYoYz10aGlzLkIuamQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGIuYmluZCh0aGlzKSwxRTMqYyk7dGhpcy5jYXB0aW9uPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSl9fSxEYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxIZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oYSl7aWYoIWUuRGYodGhpcy5jb250cm9scykpe3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy4kazt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5LYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5laS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGguc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixoLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuSWI7aC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9oLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnNvLmJpbmQodGhpcykpOmguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucm8uYmluZCh0aGlzKSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSGQoKX0uYmluZCh0aGlzKSk7CmguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuQWYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuU2EoKXx8KHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkhkKCl9LmJpbmQodGhpcykpLHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChkKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsCmMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMueGEmJih0aGlzLnhhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApjLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsueWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLmFmKCkpO3RoaXMuRWIoKX19LEViOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbmM6ZnVuY3Rpb24oKXsiaGlkZGVuIj09dGhpcy5jb250cm9scy5zdHlsZS52aXNpYmlsaXR5fHx0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuUWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkPwoodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSl9LGZpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5xYz8oZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMucWM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZHx8KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWQmJih0aGlzLmEuQS5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsCiEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0scm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZD8odGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5OYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy51Yj8oZS5pYSh0aGlzLkMsCiJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJtdXRlIiksdGhpcy51Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxhZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkfHwodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHdvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQmJih0aGlzLmEuQS5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksdGhpcy5OYigidW5tdXRlZCIsImNvbnRlbnQiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sbWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMpO3RoaXMubmR8fHRoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMucm0oKSYmdGhpcy5xbSgpJiYodGhpcy5CLnNjfHwic3BpZWdlbC5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYicHJlcm9sbCI9PWUuR2ImJnRoaXMudm8oKXx8KHRoaXMubmQ9ITAsdGhpcy54YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54YiksdGhpcy54Yj0hMSksdGhpcy56ZygpKX0scm06ZnVuY3Rpb24oKXt2YXIgYT0KZS5xZCgpO3JldHVybiB0aGlzLkIuVmImJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0scW06ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciIT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5lZnx8KGE9ITAsYy5hZEZhbGxiYWNrVVJMfHwoYy5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3JldHVybihhfHwhdGhpcy5yZSYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuZWZ9LEVsOmZ1bmN0aW9uKCl7dmFyIGE9bS5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpO3JldHVybiBhfSx2bzpmdW5jdGlvbigpe20uZ2V0Q29uZmlnKCk7CnRoaXMuZWY9dGhpcy5XYz10aGlzLlFmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLldhKCksITApO3RoaXMucmU9ITA7dmFyIGE9dGhpcy5FbCgpLGE9ZS5tZyhhLHRoaXMuQiwhMSx7b25seVVSTDohMH0pO2lmKCFhKXJldHVybiExO3RoaXMuV2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtyZXR1cm4hMH0semc6ZnVuY3Rpb24oYSl7dGhpcy5YbigpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemcoITApfS5iaW5kKHRoaXMpLHRoaXMuUm0pOih0aGlzLkxkPSEwLHRoaXMuYS5JZSgpLHRoaXMuYS51bigpLHRoaXMuamM9ITEsZS5vKGsuWmssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLkVlKCkuT2goKSl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYSgibWluVmlzIik7CmEmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5RaCgpOnRoaXMuQmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5kYyxhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi53Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnZjJiYwPHRoaXMudmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnZjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLkdrKyItIit0aGlzLkJmO3RoaXMuYiYmdGhpcy5iLlhnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPQp0aGlzLmIuWGcoKSk7cmV0dXJuIGF9LEVnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5hanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5DbXx8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5sYT1udWxsO3RoaXMuVj1bXTt0aGlzLko9bnVsbDt0aGlzLnVjPXRoaXMud2M9ITE7dGhpcy5tYT0iIjt0aGlzLk9mPSExO3RoaXMuaGg9IiI7ZCYmZC5lbXB0eT90aGlzLkFtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfQp2YXIgYj0wLGcsZD1bXTtjLmFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnFkKCksYjtiPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOm0udmEobS5NZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGUuRigibWFydGhhc3Rld2FydC5jb20iKXx8ZS5GKCJmYW5kb20uY29tIil8fGUuRigiZ2lnYS5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCkpe3ZhciBoPWUuQmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPT09CmguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihkKCl8fGcoKXx8aygpfHwiYXBwc3BvdCI9PWMpbCgpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uTWQoaCkpKyImdHlwZT1qcyIsYj1tLnZhKG0uTWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGUudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPW0udmEobS5NZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy56bS5iaW5kKHRoaXMpLHRoaXMud20uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLmxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5HYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuR2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkdifHx0aGlzLm9tKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLmNvKCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7CnZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09Zy5maXJzdENoaWxkO2MucHVzaChnKX1jYXRjaChoKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9tOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sCmM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sem06ZnVuY3Rpb24oYSl7dGhpcy5jbihhKTt0cnl7dGhpcy5sYT1hLnJlc3BvbnNlWE1MLHRoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj0KdGhpcy5TZygpO3RoaXMud2M9dGhpcy5FZigpO3RoaXMudWM9dGhpcy5haSgpO3RoaXMuaGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLk9jKCk7ZWxzZXt0aGlzLnFhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5PZj9ELmNlOkQuVGZ9KSk7dHJ5e2UudHJhY2soInN0YXRzX2hkX210eXVybCIsZS5DYih0aGlzLm1hKSwhMCl9Y2F0Y2goYyl7fX19LEFtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj10aGlzLlNnKCk7dGhpcy53Yz10aGlzLkVmKCk7dGhpcy51Yz10aGlzLmFpKCk7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuT2Y/RC5jZTpELlRmfSkpfSx3bTpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5RYSh3LlNmLHtkZXB0aDpifSkpfSwKT2M6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy5zbSgpP3RoaXMubW8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5iaCgpLGcse0FkU3lzdGVtOnRoaXMud2woKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlFhKHcuVmYpKTooYj0wLHRoaXMuem8oKSYmdGhpcy5oZih0aGlzLmJsKCkpKX0sYmY6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LmJmKCl9LHloOmZ1bmN0aW9uKCl7dGhpcy51Yz8odGhpcy51Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC55aCgpfSx6bzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpvKCk/dGhpcy5pbygpPyEwOigtMSE9dGhpcy5HYygpP3RoaXMucWEodGhpcy5RYSh3LlhkKSk6dGhpcy5xYSh0aGlzLlFhKHcuUmYpKSwhMSk6KHRoaXMucWEodGhpcy5RYSh3LlljLApELlVmKSksITEpfSxoZjpmdW5jdGlvbihhKXt0aGlzLm1hfHwodGhpcy5tYT0iIik7YS5XZHx8KGEuV2Q9W10pO2EuV2QucHVzaCh0aGlzLmhoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuWWUoKSk7YS53Yj1hLndiP2Eud2I6dGhpcy53YzthLnRjPWEudGM/YS50Yzp0aGlzLnVjO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZzt0aGlzLnBhcmVudC5oZihhKX0sYmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgUmE7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuZHVyYXRpb249dGhpcy5HYygpO2EuTT10aGlzLlpnKCk7YS5kYz10aGlzLnpsKCk7YS5rcT1bXTthLm9yaWdpbj10aGlzO2EudT10aGlzLnZsKCk7YS5BZj10aGlzLk5sKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8Cih0aGlzLm1hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuT2c7aWYoIXRoaXMuSiYmdGhpcy5sYSYmdGhpcy5sYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLmxhO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGM9ITE7KGM9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmYy5sZW5ndGgmJmUudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuTWE9YS5lcnJvci5jb2RlIT13LlhkLmNvZGU/YS5NYS5jb25jYXQodGhpcy5BbCgpKTphLk1hLmNvbmNhdCh0aGlzLkpsKCkpKTt0aGlzLlYubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYyYmdGhpcy5wYXJlbnQuZmMoYSksYj0wLHRoaXMuT2MoKSk6Cih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5xYSYmdGhpcy5wYXJlbnQucWEoYSksYj0wKX0sZmM6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZmMoYSl9LEhnOmZ1bmN0aW9uKGEsYil7dGhpcy5xYSh0aGlzLlFhKGEsYikpfSxRYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBTYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIGI8Z30sam86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlpnKCkubGVuZ3RofSxpbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuR2MoKX0sRWY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlYuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxhaTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuViYmMjw9dGhpcy5WLmxlbmd0aCYmCiF0aGlzLkVmKCkmJihhPSEwKTtyZXR1cm4gYX0sY246ZnVuY3Rpb24oYSl7dGhpcy5tYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm1hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubWE9IlVOS05PV04ifXRyeXt0aGlzLk9mPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSx3bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sWWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMub2goYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLm9oKGEucGFyZW50Tm9kZSk6ITF9LEpsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEFsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx6bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxPYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksRXA6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuT2F8fDFFMzt0cnl7dmFyIGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksYj1nLmNvbmNhdChlKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMudWQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sTmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5SbihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LERlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sR2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMudWQoYSk6IiJ9LHVkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLkdlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ha3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmxqfHxUYTtuZXcgVGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk1hPVtdO3RoaXMuTT1bXTt0aGlzLmRjPSIiO3RoaXMudT10aGlzLnRjPXRoaXMud2I9ITE7dGhpcy5LZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuTGU9IiJ9Yy5Kaj1hO2EucHJvdG90eXBlPXtXazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxIbDpmdW5jdGlvbigpe2lmKCF0aGlzLktlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubGEpe3ZhciBhPXRoaXMub3JpZ2luLmxhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGM9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1jLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLktlPWFbZF0pfXJldHVybiB0aGlzLktlfSxYZzpmdW5jdGlvbigpe2lmKHRoaXMuTGUpcmV0dXJuIHRoaXMuTGU7dmFyIGE9IiI7KGE9dGhpcy5IbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuTGU9YX0sUmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bY107cmV0dXJuIGF9fX0pKGMpO3ZhciBSYT1jLkpqfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkxpfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e2VlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLExhOiJYTUxfUEFSU0VfRVJST1IifSxSZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTGE6IkRVUkFUSU9OX0VSUk9SIn0sWWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLExhOiJFTVBUWV9WQVNUIn0sVmY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkxhOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxTZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixMYToiTE9BRF9FUlJPUiJ9LCRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixMYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LAplcDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixMYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTGE6IkRVTU1ZX0FEIn19LEQ9e1RmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTGE6Ik5PX0FEUyJ9LFVmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixMYToiTk9fTUVESUFGSUxFUyJ9LGZwOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLExhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sY2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlvPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFZhPWMueW98fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5lcnJvcj1hO3RoaXMucGQ9Yzt0aGlzLk1hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFNhPWMuT2l8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMuTml8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5QaD1hO3RoaXMudmlkZW89Yzt0aGlzLlRkPVtdO3RoaXMuTWg9W107dGhpcy5kZj1bXTt0aGlzLkpvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSygpfWMuZ3A9YTthLnByb3RvdHlwZT17SzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5QaC5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLlBoW2FdLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suWnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmhuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5UZC5wdXNoKHtzcmM6ZCxmcmFtZTpoLFNtOmUsdmVuZG9yOmMuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7Yzx0aGlzLmRmLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuZGZbY107ZC50eXBlPT09YSYmZC5Jayh0aGlzLkJsKGEpKX19LApCbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpcTohMCxocTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntWcDoidmlkZW8iLGxxOiJqc0N1c3RvbSIsbXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxucToxLEZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sClFsOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5UZC5sZW5ndGg7YysrKWlmKHRoaXMuVGRbY10udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5UZFtjXS5TbTtyZXR1cm4iIn0scm46ZnVuY3Rpb24oYSxjKXt0aGlzLk1oLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlFsKGMpLHZlbmRvcjpjfSk7dGhpcy5UbigpfSxobjpmdW5jdGlvbihhLGMpeyJ2aWRlbyI9PT1hP3RoaXMuSm8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMua2coYSxjKX0uYmluZCh0aGlzKSk6dGhpcy5rZyhhLGMpfSxrZzpmdW5jdGlvbihhLGMpe3RoaXMuZGYucHVzaCh7dHlwZTphLElrOmMsZnE6ITF9KX0sVG46ZnVuY3Rpb24oKXt0aGlzLk1oLm1hcChmdW5jdGlvbihhKXthLmxtfHwoYS5ZcCh7YWRTZXNzaW9uSWQ6ZS5YKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5qcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmxtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMudG18fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMua2I9YS5UZygpO3RoaXMuST1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkkuaWQ9ZS5YKDEwKTt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5OYT17fTt0aGlzLmxnPSExOwp0aGlzLmFjPVtdfWMuS2k9YTthLnByb3RvdHlwZT17dWw6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxlPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGU9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6ZSx5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy51bChhKTtmb3IodmFyIGM9MCxkPTAsZT0hMSxoPXRoaXMuWmwoYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMH0sbGk6ZnVuY3Rpb24oKXt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEVoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5jLmwoKSl9LHVuOmZ1bmN0aW9uKCl7dGhpcy5sZ3x8Cih0aGlzLmMucGxheSgpLGUubyhrLm1kLHRoaXMuYy5sKCkpKX0seWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSS5zdHlsZS56SW5kZXg9YTt0aGlzLkkuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5JLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkkuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkkuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTsKdGhpcy5jLlJjJiZ0aGlzLmMuUmMoKT90aGlzLmMuVGcoKS5hcHBlbmRDaGlsZCh0aGlzLkkpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5JKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxabDpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gZH0sc2w6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTtjLnBvc2l0aW9uP2MucG9zaXRpb249Yy5wb3NpdGlvbjpjLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy53aWR0aD1hLm9mZnNldFdpZHRoO2MuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gY30saGM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zbCh0aGlzLmtiKTtpZihjLnghPXRoaXMuTmEueHx8Yy55IT10aGlzLk5hLnl8fGMucG9zaXRpb24hPXRoaXMuTmEucG9zaXRpb258fGMud2lkdGghPXRoaXMuTmEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLk5hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk5hLndpZHRoJiYwPHRoaXMuTmEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5JZSgpO3JldHVybn10aGlzLk5hPWM7dGhpcy5jLlJjKCk/KHRoaXMuSS5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSS5zdHlsZS50b3A9IjBweCIpOih0aGlzLkkuc3R5bGUubGVmdD1jLngrInB4Iix0aGlzLkkuc3R5bGUudG9wPWMueSsicHgiKTt0aGlzLkkuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9Yy5oZWlnaHQrInB4Ijt0aGlzLkkuc3R5bGUucG9zaXRpb249Yy5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuYWMubGVuZ3RoO2ErKyl0aGlzLmFjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWUuRGYodGhpcy5JKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5hY3x8KHRoaXMuYWM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmFjLnB1c2goYSl9LEllOmZ1bmN0aW9uKCl7dGhpcy5JJiZ0aGlzLkkucGFyZW50Tm9kZSYmdGhpcy5JLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSSk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuS2l8fFlhLEI9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPQplLlgoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgJGE9Yy5UaXx8JGE7bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5HZChhKTt0aGlzLkNnKCl9LEdkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYWI9Yy5Eanx8YWI7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWNhKCk7dGhpcy5ZYj10aGlzLllifHwhMTt0aGlzLmNnPXRoaXMuZWc9CnRoaXMubGg9dGhpcy51YT10aGlzLkdmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLkdmPSEwO3RoaXMubGgmJnRoaXMudWcoKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmpjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMua2QoKTt0aGlzLmxoPSEwO3RoaXMudWcoKX0uYmluZCh0aGlzKSk7CnRoaXMucGcoKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5ZYil7dGhpcy5rZCgpO2lmKCF0aGlzLkdmJiYhdGhpcy5rZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuR2YmJnRoaXMuY2cmJiF0aGlzLmVnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LCRnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGIubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1iLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YSlyZXR1cm4gZC5pbnN0YW5jZX19LHBnOmZ1bmN0aW9uKCl7aWYodGhpcy5rZCgpKXt2YXIgYT0KdGhpcy4kZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLmVnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuY2c9YS5DcH10aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLlRwKCk6ITF9LEdjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5HYygpOi0xfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxxbDpmdW5jdGlvbihhLGIpe3RoaXMuWWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuWWJ8fDMwMj09dGhpcy5ZYj90aGlzLnVhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5ZYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksMTAwKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE/KHRoaXMudygpLHRoaXMub2EoKSk6YS5NZSgpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLktsKGEpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuQ2p8fGJiOyhmdW5jdGlvbihjKXtjLkVqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbm06ZnVuY3Rpb24oKXt3aW5kb3cuT08uTmoubmsubGs/d2luZG93Lk9PLk5qLm5rLmxrLkFwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWNhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkZlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBhYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgYmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIGNiPWMuRWp8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMub289YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBlYj1jLm9vfHxlYjtuZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLkhoKCl9LEhoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5VJiYoMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcyksMTAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0scmc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmcoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMucmcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5yZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuRWl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sS2g6ZnVuY3Rpb24oYSl7YT1uZXcgZmIoYSk7YS5qYT90aGlzLlAoKTp0aGlzLkwoYSl8fChhLkdkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk4oYSksKG5ldyBnYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLnJsfHwodGhpcy5ybD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuS2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLktoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGhiPWMuR2l8fGhiLFM9bmV3IGhiKHIpO1MuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGliPWMuaGx8fGliO25ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFQ9Yy5Xanx8VDsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LmNkKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguY2QoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5QbShhKX0uYmluZCh0aGlzKSk7eC5jZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKTt4LmNkKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5VbCgpfSxQbTpmdW5jdGlvbihhKXt2YXIgYj0iIixjO2ZvcihjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7Yj1pc05hTihhW2NdKT8hMTphW2NdO2lmKDEwMDk9PWFbY118fDEwMDE9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKXt0aGlzLncoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2NdKWlmKGFbY10uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbY11bZF0pPyExOmFbY11bZF0sMTAwOT09YVtjXVtkXXx8CjEwMDE9PWFbY11bZF18fDMwMz09YVtjXVtkXXx8NDAzPT1hW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkQoKX19KX0pKGMpO3ZhciBVPWMuVmp8fFU7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO3RoaXMuQWQmJihhPWUuZGwoYSx0aGlzLkFkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFQoZCk7aWYoIXRoaXMuTChkKSl7dGhpcy5OKGQpOwp2YXIgZj1uZXcgVShkLHRoaXMuRyk7Zi5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuQWR8fCh0aGlzLkFkPVtdKSx0aGlzLkFkLnB1c2goYVtiXSksZD1uZXcgVChoKSx0aGlzLkwoZCl8fCh0aGlzLk4oZCksZj1uZXcgVShkLHRoaXMuRyksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxjZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGMpfSxubzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLk5jfHwKKHRoaXMuTmM9W10pLHRoaXMuTmMucHVzaChhKSx0aGlzLnRuKCkmJih0aGlzLnBmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bY10mJjA8dGhpcy5hYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmFhW2JdW2NdLmxlbmd0aDtkKyspdGhpcy5hYVtiXVtjXVtkXShhKX19LFVsOmZ1bmN0aW9uKCl7aWYodGhpcy5OYylmb3IodmFyIGE9MDthPHRoaXMuTmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5OY1thXSxjPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbY11bZF0mJjA8dGhpcy5hYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmFhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5hYVtjXVtkXVtlXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4Lm5vKGEpfX0pfSkoYyk7dmFyIGpiPWMuWGp8fGpiLHg9bmV3IGpiKHIpO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2I9Yy5ibnx8a2I7bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sd2E6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBsYj1jLkJpfHxsYjsoZnVuY3Rpb24oYyl7Yy5DaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkQoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbWI9Yy5DaXx8Cm1iOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbGIoZCk7dGhpcy5MKGgpfHwodGhpcy5OKGgpLChuZXcgbWIoaCx0aGlzLkcpKS5mKCkpfWNhdGNoKGspe319dGhpcy5QKCl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihiPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYj1jLk1pfHxwYjtuZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLndnPXRoaXMuRWM9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dmFyIGI9dGhpcy5KZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuRWM9Yik7aWYoIXRoaXMud2cmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fAphLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixhLnNvdXJjZS5DSE9PU0VSX0FCfHwiIiwhMCk7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixjLCEwKTt0aGlzLndnPSEwfX19Y2F0Y2goaCl7fX0uYmluZCh0aGlzKSk7dGhpcy5WZygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuZ24odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSxWZzpmdW5jdGlvbigpe2lmKHRoaXMuRWMpcmV0dXJuIHRoaXMuRWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuSmcoYSkpcmV0dXJuIHRoaXMuRWM9CmF9fSxKZzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiZhLnZpZGVvU2xvdCYmKGI9YSk7YSYmYS5oZHZwYWlkJiYoYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZ246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiYKdGhpcy5lYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5tdXRlJiZ0aGlzLmVhLm11dGUoKX0uYmluZCh0aGlzKSk7YSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sbWg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy55anx8cWI7KGZ1bmN0aW9uKGMpe2MueGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLnRpJiYodGhpcy5nKCksdGhpcy50aT0hMCx0aGlzLmthKCkpOwpiLkdhKCkuYWRkRXZlbnRMaXN0ZW5lcihhLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuVmcoKT90aGlzLkQoKToodGhpcy55ZXx8KHRoaXMueWU9MSksdGhpcy55ZSsrLDEwMDx0aGlzLnllP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy54anx8cmI7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLkwoYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTsKdmFyIHNiPWMuemp8fHNiLFY9bmV3IHNiKHIpO1YuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5RbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRiPWMuUW18fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5VPygwLHRoaXMuVSkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZmt8fHViOyhmdW5jdGlvbihjKXtjLmVrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEljOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSwKYT1hLmdldFJhd1BsYXllcigpO3JldHVybiBhLmltYUFkc0xvYWRlcn0sZW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMub2EoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMuZ2V0UGxheWVyKCk7CnRoaXMuQmE/dGhpcy5lbih0aGlzLkJhKToodGhpcy5CYT10aGlzLkljKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuRCgpO3JldHVybn1pZighdGhpcy54Yyl7dGhpcy5EKCk7cmV0dXJufWE9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmViLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmViW2JdJiYzMDMhPXRoaXMuZWJbYl0mJjQwMyE9dGhpcy5lYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMub2EoKTtlbHNle3RoaXMuRCgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZWt8fHZiOyhmdW5jdGlvbihjKXtjLmdrPQp0LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlRhPS0xO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5MKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuZ2t8fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmJtfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuamY9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLldtKCl9LmJpbmQodGhpcyksNTAwKX0sV206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5VJiZ0aGlzLlUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksCmI9MDthLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYj1hLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuamYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuamYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXbjpmdW5jdGlvbigpe3RoaXMuamY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLlJqfHwKemI7KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnBjPTB9LGY6ZnVuY3Rpb24oKXt0aGlzLkVtPTEwO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5wY3x8KHRoaXMucGM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5nKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5wY3x8dGhpcy5wYysrLHRoaXMucGM8PXRoaXMuRW0/KHRoaXMucGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5XbigpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5Ranx8QWI7KGZ1bmN0aW9uKGMpe2MuU2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSwKdGhpcy5HKSkuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgQmI9Yy5Tanx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIERiPWMueG98fERiO25ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0iIjthLmN1cnJlbnRUaW1lJiYoYj1hLmN1cnJlbnRUaW1lKTtyZXR1cm4gYn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sS2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5VKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuUGp8fEViOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5HYSgpLGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZztiJiZiLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7YS5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5CYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMudW0oKTp0aGlzLnRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5nKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LFhrOmZ1bmN0aW9uKCl7dGhpcy5hZygpfHx0aGlzLmcoITApfSx1bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQmIoKTshYS5uYSYmYS5WJiZhLnpwJiZhLkJwJiYodGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZygpKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7YS5hZHNMb2FkZXI/YS5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2gpZm9yKHZhciBhPQpjLlpjLkJiKCksYj10aGlzLmdldFBsYXllcigpLkdhKCkuaWQsZT0wO2U8YS5sZW5ndGg7ZSsrKWFbZV0uaWQ9PWImJih0aGlzLkNoPWFbZV0pO3JldHVybiB0aGlzLkNofSxVcDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxnOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2E/dGhpcy5CYigpLmFkc0xvYWRlcj90aGlzLkQoITApOnRoaXMuRCgpOnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLk9qfHxGYjsoZnVuY3Rpb24oYyl7Yy5aYz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBrOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgRmIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Yy5aYy5CYigpO2lmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuUGsoYVtiXSk7dGhpcy5QKCl9fSk7Yy5aYy5CYj1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKGwmJmwucGxheWVyYXBpJiYoYT1sLnBsYXllcmFwaSgpKSYmYS5sZW5ndGgpcmV0dXJuIGE7dmFyIGE9W10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSwKYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCksYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kKTtpZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5aY3x8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuJGl8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnVqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RSYmKGE9YS5maXJzdENoaWxkKTtpZihhKXt0aGlzLlQoYSk7aWYoYS50YWdOYW1lKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1iP3RoaXMuVyhiKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxTcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYzpmdW5jdGlvbigpe3JldHVybiEwfSxHYTpmdW5jdGlvbigpe3ZhciBhO0U/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9CmMudWp8fFc7KGZ1bmN0aW9uKGMpe2MudGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMua2Y9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5rZj1hLmlkKTtFP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLmtmJiZjIT10aGlzLmtmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuJHApLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy50anx8WDsoZnVuY3Rpb24oYyl7Yy52aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRSlmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBXKGEpLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBYKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmphP3RoaXMucGYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEUsSmI9Yy52anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLlVtfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5ZaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLApjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlooKSk6dGhpcy5aKCk6dGhpcy5aKCk6dGhpcy5aKCl9LHduOmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxYcDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBNYj1jLllpfHxNYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5xZygpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMua2EoKX0uYmluZCh0aGlzKSl9LHFnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLkdldEFkRXJyb3JzQ2FjaGUoKSxjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5oYW5kbGVFcnJvcihiW2NdKTthLkNsZWFyQWRFcnJvcnNDYWNoZSgpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT0KYSl0aGlzLnFnKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuZygpKX19LGc6ZnVuY3Rpb24oYSl7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIE5iPWMuWGl8fE5iOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7YXx8KGE9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYSYmYS5HZXRBbGxQbGF5ZXJzJiYoYT1hLkdldEFsbFBsYXllcnMoKSkmJjA8YS5sZW5ndGgpZm9yKHZhciBiPQowO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTWIoYVtiXSk7Yy5qYXx8dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgTmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIE9iPWMuWml8fE9iLFBiPW5ldyBPYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYj1jLkltfHxRYjtuZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTsKYnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWigpfSxSZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sZm46ZnVuY3Rpb24oKXt0aGlzLlhjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWGN8fCh0aGlzLlhjPSEwLHRoaXMuUmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlhjJiYodGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlhjPSExKSx0aGlzLlJkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgUmI9Yy5qa3x8UmI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sTGg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxoLmJpbmQodGhpcyksMTApfSxiYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMub2s9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuZygpKToodGhpcy5va3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuZygpKX0sWWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuYmMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLllmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuTGgoKTt0aGlzLllmKCk7dGhpcy5qbigpfSxqbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmRuP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLmRuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuYmMoYSkpfX0pfSkoYyk7dmFyIFNiPWMuaWt8fFNiOyhmdW5jdGlvbihjKXtjLmtrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEuZm4oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgVGI9Yy5ra3x8VGIsVWI9bmV3IFRiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLmpsfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLkZoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLkptPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX1lbHNlIHRoaXMuWigpfSx3bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KbX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUGQoYSl9LmJpbmQodGhpcykpfSxQZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5GaCYmKHRoaXMuRmg9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLlpqfHxOOyhmdW5jdGlvbihjKXtjLllqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5CZSlpZih0aGlzLkhifHwKKHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuSm4oKTp0aGlzLmcoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuZygpOnRoaXMuZyghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkJlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuY2EoYSk7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5Zanx8TzsoZnVuY3Rpb24oYyl7Yy4kaj0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVGE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5wZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFdiPWMuJGp8fFdiLFhiPW5ldyBXYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYj1jLkVrfHxZYjtuZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnFqfHxZOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmloPTA7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmVkPSExO3RoaXMuSmg9ZS5MYigxMCk7dGhpcy5xaCgpfSxxaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnNiKCksITA7dGhpcy5paCsrO2lmKDEwPHRoaXMuaWgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuZyghMCk6dGhpcy5nKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5xaC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLnVhPQohMH0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgWj1jLnBqfHxaOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWSh3aW5kb3cucGxheWVyKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLnJqfHxaYiwkYj1uZXcgWmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy4kbHx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5WaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2coKX0sc2c6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBjYz1jLlVpfHwKY2M7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmphKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYz1jLldpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmM9Yy5Va3x8ZmM7bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLndpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy53aXx8Z2M7KGZ1bmN0aW9uKGMpe2Mudmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpO3RoaXMuc2UoKTt0aGlzLm9nKCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LENhOmZ1bmN0aW9uKCl7dGhpcy51YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sb2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5vYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9nLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuc2UuYmluZCh0aGlzKSwxMDApfSxzZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMudml8fGhjOyhmdW5jdGlvbihjKXtjLnhpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT0KbmV3IGdjKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgaGMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuUmEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlJhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMueGl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLm5sfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMucmg9dGhpcy50aD10aGlzLnNoPSExO3RoaXMuQ2Q9W107dGhpcy5vZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHphP251bGw6emEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgUz9udWxsOlMsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFViP251bGw6VWIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Maj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLkxsKGEpOltdLGM7dGhpcy50aD0hMDtpZihhLmxlbmd0aCl7dGhpcy5zaD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sCnRoaXMuUmgoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLm9mKXtpZih0aGlzLnJoKWJyZWFrO2M9dGhpcy5vZltkXTt0aGlzLkpmKGMpJiYodGhpcy5DZC5wdXNoKGMpLHRoaXMuUmgoYykpfX0sSmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxMbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZD1hW2VdLGQ9dGhpcy5vZltkXSx0aGlzLkpmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LFJoOmZ1bmN0aW9uKGEpe3RoaXMuSmYoYSkmJmEuZigpfSxZbjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuc2gpZm9yKHRoaXMucmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uU2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5TYil9fX0pKGMpO3ZhciBsYz1jLkxqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5nbHx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRmMoay5BbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsCmMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTt2YXIgRz1uZXcgSCxsPSExO0cuZmEoKTtHLm5oKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5mYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcubmgoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LAohMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuTmcod2luZG93LEcuZG0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5TaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy54ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTt0aGlzLkVkPTA7dGhpcy5JaD0hMTt0aGlzLmxmPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnlpPWE7YS5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3RoaXMuR2g9YX0sdmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmJiPXRoaXMucGxheWVyLlIoKX0sCmdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQW46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx6bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTsKdmFyIGQ9ITEsZj0hMTtpZih0aGlzLmVtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5wYSx0aGlzLm5iLm5mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMudm4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuJG4oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsaCk7bC54bih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuRG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5TaChsKX19LGVtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy54ZC5nZXRUaW1lKCksdGhpcy54ZD1hLDNFNTxjPyEwOiExO3RoaXMueGQ9YTtyZXR1cm4hMX0sUW46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS51ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLklnKGEpKT90aGlzLlNjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksCjApLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfSxQbjpmdW5jdGlvbihhKXtpZighdGhpcy5HaCl7ZS51ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuRm4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSWcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsubWQsdGhpcy5wbGF5ZXIubCgpKSl9fSxJZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sbW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Nbih0aGlzLlBuLmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5LYSgpfSxJZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS51ZigibWlkcm9sbCIpO2lmKCF0aGlzLndoKXt0aGlzLndoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfX0sbG46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Fbih0aGlzLklkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlplKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlFuKCk7dGhpcy5wbGF5ZXIuWmUmJnRoaXMubG4oKTt0aGlzLm1uKCl9LG5uOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkRkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5jcChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRWQ9dGhpcy5EZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkVkJiYoYT0hMCk7cmV0dXJuIGF9LHZuOmZ1bmN0aW9uKGEpe3RoaXMuSWg9YTtmb3IoYT0wO2E8dGhpcy5EZC5sZW5ndGg7YSsrKXRoaXMuRGRbYV1bImZ1bmN0aW9uIl0odGhpcy4kbS5iaW5kKHRoaXMpKX0sJG06ZnVuY3Rpb24oYSl7dGhpcy5FZC0tO2EmJnRoaXMubGYucHVzaChhKTswPj10aGlzLkVkJiZ0aGlzLkloKCl9LERtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLmxmLmxlbmd0aDtkKyspYz0KdGhpcy5sZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy55aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnBsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoZWVCaWNoYWhNaWFNZWVHaCxlZUJpY2hhaE1pYU1lZUdoKTsK
- 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 34FB
|
724 B
1 KB
|
19ms
7ms
|
XHR
application/json |
13.225.78.95
Amazon.com
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=4024001810
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGVlQmljaGFoTWlhTWVlR2g9ZWVCaWNoYWhNaWFNZWVHaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZmZ8fCh4LmZmPTApO3guZmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5mZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5IayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2IudmYoYyk7Yi5BbihtKTtiLnpuKGwpO2Iubm4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Jbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS51aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5pbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGs9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlptLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5naD17fTt0aGlzLnNmPSExfWMuY2o9YTthLnByb3RvdHlwZT17Wm46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnNmfHwodGhpcy5zZj1lLlgoMTApKTtyZXR1cm4gdGhpcy5zZn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmdoW2JdJiYodGhpcy5naFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlpuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx6azpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sWm06ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuWW0oYi5kYXRhKX0sWW06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxCZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5XZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMueWQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxXZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx4azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnRsKGIpKXJldHVybjsoYT10aGlzLkJnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx0bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFVnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxLbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHhmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuYWwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuS24oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sSms6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGFsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5KayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxEZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxwaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFRoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGttOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scWQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAphbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxGajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxoazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQWkoKXx8Yi5IaSgpfHxiLmFtKCl8fGIuRmooKXx8Yi5oaygpfHxiLnNqKCl8fGIuVWooKX19O3JldHVybiBudWxsIT1iLkRrKCl9LHlsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxkbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxSbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxRZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMua2koYSkrIjoiK3RoaXMua2koTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGtpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx1ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE5nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxhbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk1sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sU246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLnZhKGIsITApO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS52YShmLCEwKTtmPW0udmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFFkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uT2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnVkKGIpOiIifSx1ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG1nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5wbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnFmJiZ3aW5kb3cuc2FuZGJveC5xZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLkxnKGIpKXJldHVybiB0aGlzLkxnKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS53ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy54ayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHlkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5bTpmdW5jdGlvbihiLGEsZCl7dGhpcy55ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx1aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMueW0oZi53ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGNwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxGazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0saW06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmJqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWm89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5rbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmJwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuZ2c9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuWmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5kZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5oZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EucGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuYmc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Gbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS4kbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLlprPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5tZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5mZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eucms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5iZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnFrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5yaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuemQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS55Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuWW89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQm89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Bbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLmZsfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxJbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnRkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudGQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG5oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5JbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnRkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmRqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuSWk9YX0pKGMpO3ZhciBLPWMuSWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Ca3x8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Laj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5CbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scGY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sR2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudGgmJkwuWW4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxqbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLktqfHx0OyhmdW5jdGlvbihjKXtjLk1qPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5EZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTW46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRW46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sR2Q6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnRrKCk7dGhpcy5HZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHRrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxTaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LE9oOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkRnfHwodGhpcy5EZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLk1qfHxxOyhmdW5jdGlvbihjKXtjLnppPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuV2Y9IjEiO3RoaXMuWGY9IjIiO3RoaXMubWs9IjMiO3RoaXMuJGM9MDt0aGlzLkZtPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5pZz10aGlzLm1pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMudmYoYSk7dGhpcy5DbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm1pfHwodGhpcy5taT0hMCxlLlhlKCkpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGNtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0sZ206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMud2YoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmNtKCk7aWYoIXRoaXMuZ20oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMud2YoKTtyZXR1cm59dGhpcy53ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuZ2koKTt0aGlzLmlnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy56YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGdpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldmfSx3ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWGZ9LEpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ta30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxhZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5XZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWGZ9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx2ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxHbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEJtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy56aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Canx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLnRvfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuS2coKTt0aGlzLk1nKCk7dGhpcy5Zaz0hMX0sS2c6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5JZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSWQoYil9LmJpbmQodGhpcykpfSxJZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5uanx8cmE7KGZ1bmN0aW9uKGMpe2MubWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5rZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgZz0wO2c8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7ZysrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbZ10udGFnKXt0aGlzLnliPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueWI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMueWI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0KImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPGQubGVuZ3RoO2crKylhLm9uKGRbZ10sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtnXSYmKHRoaXMuaGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtnXSYmdGhpcy5BaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkZtJiYhdGhpcy56YSgpJiYodGhpcy55Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLApmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLllrPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5CZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmFkLmluZGV4T2YoYikmJnRoaXMuYWQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmFkLmxlbmd0aD49dGhpcy5rZSYmdGhpcy5nKCkpfSwKQm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRGYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmhlfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuS2coKSxiLk1nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLm1qfHxzYTsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT0KdGhpcy5DbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKWEucHVzaChiW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpO3RoaXMuTChnKXx8dGhpcy5qbShnKXx8KHRoaXMuTihnKSxnPW5ldyBzYShnLHRoaXMuRyksZy5LKCksZy5mKCkpfX10aGlzLlAoKX19LEpwOmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LENsOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihhLmFuY2hvcil9fSl9KShjKTt2YXIgdGE9Yy5vanx8dGEsdWE9bmV3IHRhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuYm98fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmNrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEpe3ZhciBiPWEuZWxfO2J8fChiPWEuZWwoKSk7Yj8odGhpcy5UKGIpLChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYSl7dGhpcy5QZChhKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFiWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuYXV0b3BsYXk/YS5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHdhPWMuY2t8fHdhOyhmdW5jdGlvbihjKXtjLmJrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5LYz10aGlzLkJhPXRoaXMuZWQ9ITE7dGhpcy5KaD1lLkxiKDEwKTt0aGlzLklmPSEwO3RoaXMueGM9dGhpcy5raD0hMTt0aGlzLkttKGEuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy56aCgpLHRoaXMuS2soKSx0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGEuViwiOyIsdHlwZW9mIGEuViwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYS5WP2EuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGEuVj90eXBlb2YgYS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYS5pbWEsIjsiLHR5cGVvZiBhLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGEuSCwiOyIsdHlwZW9mIGEuSCwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLmltYT9hLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5pbWEmJmEuaW1hLkVhP2EuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IixhLmltYSYmYS5pbWEuRWE/dHlwZW9mIGEuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5mZToKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixhLkg/YS5ILmZlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILmdlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZ2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/CnR5cGVvZiBhLkgubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5xZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuSmgpfSxIYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5pbWEzJiYodGhpcy5pbWE9YS5pbWEzKTtpZihhLmltYSl7dGhpcy5pbWE9YS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LEljOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmEpe3ZhciBhPXRoaXMuSGMoKTthJiYoYS5hZHNMb2FkZXImJih0aGlzLm5hPWEuYWRzTG9hZGVyKSxhLl9hZHNMb2FkZXImJih0aGlzLm5hPWEuX2Fkc0xvYWRlciksYS5nZXRBZHNMb2FkZXImJih0aGlzLm5hPWEuZ2V0QWRzTG9hZGVyKSxhLmNvbnRyb2xsZXImJmEuY29udHJvbGxlci5zZGtJbXBsJiZhLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm5hPWEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm5hfSxZZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGhtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuamgpe3ZhciBhPQp0aGlzLkhjKCksYj10aGlzLmZtKCk7d2luZG93LmltYSYmYSYmKGEuX2Fkc0xvYWRlcnx8YS5hZHNMb2FkZXJ8fGIpJiYodGhpcy5qaD0hMCl9cmV0dXJuIHRoaXMuamh9LGZtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5lZCYmYS5hZHMmJihhLmFkcy5zdGF0ZXx8YS5hZHMuX3N0YXRlKSYmKHRoaXMuZWQ9ITApO3JldHVybiB0aGlzLmVkfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWMoKTtpZihhKXt2YXIgYj0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rbigpfS5iaW5kKHRoaXMpKSwKYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxrbjpmdW5jdGlvbigpe3RoaXMueGM9ITA7dmFyIGE9dGhpcy5ZZygpO2lmKGF8fHRoaXMuemEoKSl7dmFyIGI9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5jYShiKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuU2EoKSYmKGQ9Ik1fIik7YS5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDsKaWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYi5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnljfHwodGhpcy5tKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5iYSgpLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LElwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5BZyYmYS5hZHMmJih0aGlzLkFnPWEuYWRzKTtyZXR1cm4gdGhpcy5BZ30sS2s6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7CnRoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLkFoKCl9LmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YSYmKChhPXRoaXMuWWcoKSkmJmEuZGVzdHJveT9hLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoKX0uYmluZCh0aGlzKSw1MCkpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcoKSYmMDxhLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5obSgpKXt2YXIgYj10aGlzLkhjKCksZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLncoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5raD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8KKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMua2g9ITA7YS5pc1BsYXlpbmcoKSYmMTA8YS5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDUwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sTGs6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpOwpyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGsoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIGUueGU/ITE6dGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXtpZih0aGlzLllsKCkpe3RoaXMudWE9ITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXRoaXMuSWY9ITEsZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsInNldCIsITApO3RoaXMuZyghMCl9ZWxzZSB0aGlzLnVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpfSxZbDpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPQohMTtlLnlkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2E9IWUuZmIoYi5jYyl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthPSExfSwhMCwhMCk7dmFyIGI9ZS55bCgpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUueGU9LTEhPWIuaW5kZXhPZigiZmlyZWZveCIpfHwtMSE9Yi5pbmRleE9mKCJzYWZhcmkiKXx8YX1yZXR1cm4hMX0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy56YSgpfHwoYXx8KHRoaXMuSWY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSWYsZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApUazpmdW5jdGlvbigpe3RoaXMuUnB8fCgxMDx0aGlzLkxvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuTG8rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5zbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxzbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Nbyl7dGhpcy5Nbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmEudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5kaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuWGgod2luZG93KTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl0cnl7Yj1ifHx0aGlzLlhoKGFbZ10pfWNhdGNoKGQpe310aGlzLlAoKX19LFhoOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTt2YXIgeWE9Yy5ka3x8eWEsemE9bmV3IHlhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Baj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEFhPWMuQWp8fEFhO25ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuZ2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTsKcmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5XKGEpOnRoaXMuWigpfSxWbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZiLGc9dGhpcy5oYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5qYyYmKDA8PWcuaW5kZXhPZihkKXx8Yi5CZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuZ2Y9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKd2E6ZnVuY3Rpb24oKXt0aGlzLmdmKys7aWYoMTA8dGhpcy5nZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgphJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7dmFyIEJhPWMuSGp8fEJhOyhmdW5jdGlvbihjKXtjLkdqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5IYisrLDE1PHRoaXMuSGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPQohMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpOwp2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm9sPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5vbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlZtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Hanx8Q2E7KGZ1bmN0aW9uKGMpe2MuSWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBCYShhW2JdKTtnLmphfHx0aGlzLkwoZyl8fCh0aGlzLk4oZyksKG5ldyBDYShnLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Janx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuVGx8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlVnKGEsImVsZW1lbnRJRCIpOwpzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLlhtPWEucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1hLndpZHRoO2cuc3R5bGUubWluV2lkdGg9YS53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5YbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5yZD1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMucmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnJkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sU2s6ZnVuY3Rpb24oKXtlLnBoKHRoaXMucmQpO2UuT2UodGhpcy5yZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5qanx8R2E7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaWp8fEhhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiYKbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5VZyhhLCJlbGVtZW50SUQiKTtpZihlLnBoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmtqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy53anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPQoiR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxEbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHVrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixnLGQsZil7dGhpcy5YYT1iO3RoaXMuUGc9dGhpcy51aT0hMTt0aGlzLkJoPWQ7dGhpcy5ZaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmCjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJm0mJm0uUmUodGhpcy5YYS51cmwpJiZtLlZjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5EbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiKwpkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlBnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0aGlzLmhiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5ZaD90aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy51aXx8KHRoaXMuaGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwKInJlcXVlc3RfZmFpbGVkIiwhMCk6bS5SZSh0aGlzLlhhLnVybCksdGhpcy5CaCYmdGhpcy5CaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9Yy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkRhPXRoaXMuYmU9ITF9Yy5KaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihiKXt0aGlzLmJlPWJ9LEduOmZ1bmN0aW9uKGIpe3RoaXMuRGE9Yn0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIiwicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIiwKdnA6IkFkU2tpcHBlZCIsd3A6IkFkU3RhcnRlZCIsbHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixtcDoiQWRJbXByZXNzaW9uIixpcDoiQWRDcmVhdGl2ZVZpZXciLHBwOiJBZFZpZGVvTWlkcG9pbnQiLHFwOiJBZFBhdXNlZCIsc3A6IkFkVmlkZW9TdGFydCIsdHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5iZSxhW2RdKX0scG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmFlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmFlKXRoaXMuRGEuYWUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuRGEsdGhpcy5EYS5hZVthXSk7dGhpcy5EYSYmdGhpcy5EYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYS5nZXRFcnJvcigpO2ImJmNvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsImdvdCBlcnJvciIsYil9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5iZSYmdGhpcy5xbigpO3RoaXMuRGEmJnRoaXMucG4oKX19fSkoYyk7dmFyIE1hPWMuSml8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IYT0hMTt0aGlzLiRiPSIiO3RoaXMuZmQ9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5HZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm5mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuWmQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7CnRoaXMuWWQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnZiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLldiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLlBiPSIiO3RoaXMuUWI9W107dGhpcy5SYj1bXTt0aGlzLlVjPVtdO3RoaXMub2M9IiI7dGhpcy5BYj0hMTt0aGlzLk9kPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaWM9ITE7dGhpcy52Zz10aGlzLlVkPW51bGw7dGhpcy56Zj10aGlzLlZiPXRoaXMuRmc9dGhpcy5TZD10aGlzLlZjPXRoaXMuaGQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnZkPTA7dGhpcy5maD0hMTt0aGlzLmVoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy4kYixhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlpiLGFkdGFncmVnZXg6dGhpcy5mZCxiaXRyYXRlOnRoaXMuT2EsanNwb3B1cHM6dGhpcy5UZSxzaWRlbG9hZHM6dGhpcy50YixkaXNhYmxldGVzdHM6dGhpcy5HZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLlNlLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnBhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuWmQsSE9NQURfQkxPQ0tFRDp0aGlzLllkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsCnRlc3RUYWdzWEhSOnRoaXMuVWMsdGVzdDNQQ29va2llOnRoaXMub2MsdGhyb3R0bGU6dGhpcy5PZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLmljLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudmcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5zYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuaGQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuVmMsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuU2QsY29uZmlnRmFpbHVyZXM6dGhpcy5aYSxzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5yZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLnpmLHZtYXBzOnRoaXMuTmYsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHluOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy4kYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLmpiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuWmI9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5mZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkdnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuU2U9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuSmM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5wYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9CmIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLlpkPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuWWQ9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMudmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5XYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMub2M9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLk9kPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmljPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLnZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuaGQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmCih0aGlzLlZjPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuU2Q9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLlphPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5yZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuemY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmCih0aGlzLk5mPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuemM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmllPWIuYWRGYWxsYmFja1VSTCl9LFZsOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09dHlwZW9mIHRoaXMuWmFbYV0mJjE9PXRoaXMuWmFbYV0mJihiPSEwKTtyZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYil7dGhpcy5aYVtiXT0hMH0sRGw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxNZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9ZS5GayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fAp0aGlzLlpifHx0aGlzLmZkKSYmKGg9dGhpcy5IbShoKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkZsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sUWU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKTGM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuZ2EmJnRoaXMuZ2EubGVuZ3RoJiYwPHRoaXMuZ2EubGVuZ3RoJiYoYT10aGlzLmdhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFJlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuUWUoYik7cmV0dXJuIGF9LEZsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwOwpyZXR1cm4ibm9uZSJ9LHdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2FbdGhpcy5yZl19LFBjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy53ZCgpLGE9dGhpcy5UaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSx4aDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxHbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPApoLmxlbmd0aDtGKyspe3ZhciBrPWhbRl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy54aChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZiloLnB1c2gobCsiPSIrZltsXSk7Zj1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMueGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxIbTpmdW5jdGlvbihiKXt0aGlzLiRiJiYoYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5HbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sUms6ZnVuY3Rpb24oKXt0aGlzLnlhJiYKdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLk1rKHRoaXMueWEuY2xpZW50QVBJcyl9LE1rOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmYS5IbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuR24oYi5wbGF5ZXIpO2EuZigpfX0saTpmdW5jdGlvbihiLGEsZCxmLGMsZSl7bT10aGlzO3RoaXMuU2U9ITA7dGhpcy5KYz1iO3RoaXMucGE9YTt0aGlzLm5mPWQ7dGhpcy5VZD1mO3RoaXMuRGM9Yzt0aGlzLnlhPWV8fHt9O3RoaXMuUmsoKTt0aGlzLnhtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnBhKXRoaXMudm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSwKcmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LHhtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLkpjK3RoaXMub2UoImdsb2JhbCIpKSx0aGlzLlNsLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnRmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuQWMoKX0uYmluZCh0aGlzKSwhMCl9LHZtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLnBhK3RoaXMub2UoImNsaWVudCIsLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoKIj8iKSsoImNhY2hlPSIrdGhpcy5MYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGRhOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhkKXt0aGlzLmhkPSEwO3ZhciBhPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChnKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpOwpmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkRjPSExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWWQpKTsKdGhpcy5UYigpO2UuRmMoay5UbSk7KGE9ZS5DYih0aGlzLndkKCkpKXx8KGE9ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sU2w6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9aWYoIWEuZW5hYmxlZHx8IWEuZm9yY2VfZGlzYWJsZWQpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSwKdGhpcy5UYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnBhfWVsc2UgZD10aGlzLnBhO2lmKCEoZC5lbmFibGVkJiZkLnNlcnZlciYmZC5hbGlhcyYmZC5jb25maWcpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5nYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLkYoIndlYi5kZSIpfHxlLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8CmUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLkxjKCkpZm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5PYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuSmU9ZC5hZHBhdGh8fCIiO3RoaXMucmY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5UYigpKX0sTWM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEEodGhpcy5QYygpKSxkPXRoaXMudGEodGhpcy5PYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEEodGhpcy5PYit0aGlzLm9lKCJjdXN0b21lciIpKTt0aGlzLklhKGEsdGhpcy5hby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY3VzdG9tZXIiKTtiP3RoaXMuVGo/dGhpcy5kYSgibm9TVk1Db25maWciKToodGhpcy5Uaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGFvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuaWM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuVmM9dGhpcy5mYihkLnN0cmljdCk7dGhpcy5TZD10aGlzLmZiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkZnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy4kYT10aGlzLmZiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUGI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5SYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLlVjPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy5vYz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy4kYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlpiPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5mZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT0KZC5qc3BvcHVwc3x8ITE7dGhpcy50Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5WYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuVmI7dGhpcy56Zj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmpkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5OZj1kLnZtYXBzfHwiIjt0aGlzLnpjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmllPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLk9kPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuaWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmljPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMucG8oKSYmKHRoaXMuUGJ8fHRoaXMuUmJ8fHRoaXMuUWJ8fHRoaXMuVWMpP3RoaXMubmY/KHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuVGIoKSk6CnRoaXMuZm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GZigpKX19LGZvOmZ1bmN0aW9uKCl7dGhpcy5lbygpO3RoaXMuaG8oKX0saG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksCkY9ZS5YKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihGLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoRikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwplLnpiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUucWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxGZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuVGIoKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGIpKSx0aGlzLlRiKCksdGhpcy50ZSgpKX0sZW86ZnVuY3Rpb24oKXtpZih0aGlzLlBiKXt2YXIgYj1lLnFkKCk7aWYoKGIuaXNDaHJvbWV8fGIuaXNGaXJlZm94KSYmdGhpcy5tbSgpKXRoaXMuTmQodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUGIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5QYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwpiPWR9Y2F0Y2goZil7fWI/dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5jaSgpfX1lbHNlIHRoaXMuY2koKX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy5rbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuWmguYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWZ1bmN0aW9uIGEoKXt0aGlzLk5kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5RYj10aGlzLlVjKSYmdGhpcy5RYi5sZW5ndGgpe3ZhciBkPXRoaXMuUWIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5aaCgpfSxrbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IEEoYiksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLmJpLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBhKCl7dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlJiJiZ0aGlzLlJiLmxlbmd0aCl7dmFyIGQ9dGhpcy5SYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmJpKCl9LGxvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwKITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihhLGQpe2Q9PWImJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sWmg6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLnlkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMuZmIoYi5jYyk7dGhpcy5GZigpfS5iaW5kKHRoaXMpLHRoaXMuJGguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy4kaCgpfWVsc2UgdGhpcy5GZigpfSwKJGg6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKTt0aGlzLlRiKCk7dGhpcy50ZSgpfSxtbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChiKXtyZXR1cm4iZmFpbCJ9fSxUYjpmdW5jdGlvbigpe3ZhciBiPSIwIixhPSIwIjt0cnl7ZS5TYSgpJiYoYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQWIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlpkKSk7dGhpcy5VZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVkJiZ0aGlzLlVkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkFifSl9LApRazpmdW5jdGlvbigpe2lmKHRoaXMuU2QmJnRoaXMuVmwoKSl7dmFyIGI9dGhpcy5EbCgpO2ImJmIuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYi5qb2luKCJfIiksITApfX0sZ2k6ZnVuY3Rpb24oYil7Ynx8KGI9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGIpdHJ5e2I9Yi50b1N0cmluZygpfWNhdGNoKGEpe2I9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9Yj1iLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITApfSxJYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy52ZHx8KHRoaXMudmQ9MCk7dGhpcy52ZCsrO3RoaXMudmQ+dGhpcy5laCYmIXRoaXMuZmgmJih0aGlzLmZoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5laCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi51aT0hMCk7YyYmZS5rbSgpJiYoYi5QZz0hMCk7aCYmKGIuWWg9ITApO3JldHVybiBiLmxvYWQoKX0sTms6ZnVuY3Rpb24oKXtlLlNhKCl8fAplLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmRhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMudGEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5kYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sY286ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuTmZ9LE9rOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKITApO3ZhciBiPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2IuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYix0aGlzLkVvLmJpbmQodGhpcyksdGhpcy5Eby5iaW5kKHRoaXMpKX0sRW86ZnVuY3Rpb24oYil7dmFyIGE9bnVsbCxkPW51bGw7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLm1sKCl9LERvOmZ1bmN0aW9uKCl7fSxtbDpmdW5jdGlvbigpe2UuRmMoay5sbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sCnRlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMudGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy50Yi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLnRiW2JdOyJyZXF1ZXN0Ij09YS50eXBlJiZlLmFiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09YS50eXBlKXt2YXIgZD1uZXcgSDt3aW5kb3dbZC5mYSgpXT10aGlzO2UuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKGIpe2lmKGIucmVzcG9uc2VUZXh0KXRyeXtldmFsKGIucmVzcG9uc2VUZXh0KX1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0scG86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5PZH0sTGI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0KIiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9LHpiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsYyxlLGgsayxsPTA7bDxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQobCsrKSxmPWIuY2hhckNvZGVBdChsKyspLGM9Yi5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxoPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBhfSx0YTpmdW5jdGlvbihhKXt2YXIgZz0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtnW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZ1sxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSxUaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBnKGEpe3ZhciBiPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9YT4+PjQqZCYxNSxiKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspaFtjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWhbY109ZChoW2MtM11eaFtjLThdXmhbYy0xNF1eaFtjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditoW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditoW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGcoaykrZyhsKStnKG0pK2cocikrZyh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLG09bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuYXA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLmFwfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmJiPWEuYy5SKCk6dGhpcy5iYj0iIjthLmMubWgmJmEuYy5taCh7cGF1c2U6dGhpcy5CZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlFoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmFmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMud28uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5rYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmVjPXRoaXMuZ2Q9ITE7dGhpcy5Daz0xRTM7dGhpcy5yYT1udWxsO3RoaXMuQj1nO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLktkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLkdrPWUuWCgxMCk7CnRoaXMuQmY9MDt0aGlzLmRkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZGQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZGQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQWs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5lZj10aGlzLkpkPSExO3RoaXMudmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLm5lPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5qYz0hMTt0aGlzLiRrPWUuWCgxMCk7dGhpcy5LYj1lLlgoMTApO3RoaXMuSWI9ZS5YKDEwKTt0aGlzLlVoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuVmQ9CnRoaXMuVWI9dGhpcy52ZT10aGlzLm5kPXRoaXMuTGQ9dGhpcy51Yj10aGlzLnFjPXRoaXMuRGg9dGhpcy5zZD10aGlzLnFvPXRoaXMueGI9dGhpcy5KYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5SbT0yMDA7dGhpcy5RZj10aGlzLldjPXRoaXMucmU9dGhpcy5QZj10aGlzLm1mPSExO3RoaXMuY2Y9e319Yy5haj1hO2EucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBnfSxoaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5HYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuVW4oKTtlLm8oay5yayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXZTpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLnhiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkIuUyl0aGlzLkJmKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5CLlFrKCksYz1tLmdldENvbmZpZygpLGUueGUmJih0aGlzLkIueW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQi5IYSYmdGhpcy5CLmlzRW5hYmxlZD8odGhpcy5oaSgpLG5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQi5WYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLmhpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5CLlZiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBrPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2suV2UoYSxnLGQpfSw1MCl9fSxoZjpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuVmQ9dGhpcy5VYj10aGlzLnNkPSExO3RoaXMuYj1hO3RoaXMuTm4odGhpcy5iKTt0aGlzLmFoKGEpO3RoaXMudmM9dGhpcy5SZyhhKTt0aGlzLlZrKCl9LGFoOmZ1bmN0aW9uKGIpe2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mCmEmJih0aGlzLktkPXRoaXMuT2woYikpLHRoaXMuYWgoYi5wYXJlbnQpKX0sUmc6ZnVuY3Rpb24oYil7dmFyIGM9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoYz10aGlzLlJnKGIucGFyZW50KSksYy5wdXNoKHRoaXMueGwoYikpKTtyZXR1cm4gY30seGw6ZnVuY3Rpb24oYSl7dmFyIGM9IiIsZD1bXTtpZihhJiZhLkomJmEuSi5nZXRBdHRyaWJ1dGUpe2M9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylkLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpjLGNyZWF0aXZlSUQ6ZH19LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5KKXtjPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpOwpmPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKylkLnB1c2goYS5sYihjW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmh9fSxxYTpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGM9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJgooYz1hLmVycm9yLmRldGFpbC5jb2RlKSxhLnBkJiZhLnBkLmVycm9yJiZhLnBkLmVycm9yLmNvZGUmJihjPWEucGQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5ZYy5jb2RlOmM9PUQuY2UuY29kZT9lLm8oay5abyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOihlLlhlKCksYz09RC5VZi5jb2RlJiZlLm8oay5MbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKTtlLm8oay5rbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVm4oKTt0aGlzLlVhKCJlbXB0eSIpO3RoaXMuQi5BYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkFiLCEwKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Gbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LlZmLmNvZGU6ZS5vKGsuJG8sCnRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUubyhrLk1tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUubyhrLkJvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUubyhrLkNvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuVWEoInVua25vd24iKX10aGlzLmZjKGEpO3RoaXMuUGEoKX0sZmM6ZnVuY3Rpb24oYSl7dmFyIGM9CjkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihjPWEuZXJyb3IuY29kZSw5MDE8YyYmKGM9OTAwKSk7Zm9yKGM9eyJbRVJST1JDT0RFXSI6Y307YS5NYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk1hLnBvcCgpO3RoaXMuVmUoZC51cmwsZC50eXBlLGMpfWNhdGNoKGYpe319LE5uOmZ1bmN0aW9uKGEpe3RoaXMudmU9ITE7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dmFyIGM9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYz10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuZ2IuekluZGV4PWM7Yz10aGlzLmEuQTt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksZj0iIjtkJiZkLmVudnZhcnMmJihmPWQuZW52dmFycygpKTtmLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLmdldEVudmlyb25tZW50VmFyaWFibGVzJiYoZj1kLmdldEVudmlyb25tZW50VmFyaWFibGVzKCkpOwpmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5tZj0hMCl9Y2F0Y2goaCl7fWMuY3E9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGMuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihjLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZjLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLkFrJiZ0aGlzLnBsYXllci5DZSgpJiYoYy52b2x1bWU9dGhpcy5wbGF5ZXIuQ2UoKS8xMDApO2Zvcig7Yy5maXJzdENoaWxkOyljLnJlbW92ZUNoaWxkKGMuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPAphLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy52ayhjLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMubWYmJmMubG9hZCgpO2lmKHRoaXMuZGkoYykpe3RoaXMuVmgoInNldHVwIix0aGlzLldhKCkpO3RoaXMueWsoYyk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLm1mP3RoaXMudmlkZW89Yzp0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyl9Y2F0Y2gobCl7dGhpcy52aWRlbz1jfX1lbHNlIHRoaXMuYi5XaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChjKSx0aGlzLkxuKCkpOnRoaXMuYi5vcmlnaW4uSGcody4kZCl9LExuOmZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnViPXRoaXMucWM9ITE7dGhpcy5hLmMuc2EmJnRoaXMuYS5jLnNhKCkmJihlLm8oay55Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudWI9ITApO2UudWUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4ubWEmJmUuemsodGhpcy5iLm9yaWdpbi5tYSk7dGhpcy5WaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS5FaCgpO3RoaXMuYS55ZigpO2ZvcihhPQp0aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5hLnlmKCk7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy5yYT10aGlzLmEuSTt0aGlzLm5pKCJ2cGFpZCIpO2lmKHRoaXMudWIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5OYigibXV0ZWQiLCJjb250ZW50Iik7ZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX10aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsCiJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5hLkkuYXBwZW5kQ2hpbGQodGhpcy5DKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUueGYodGhpcy5DLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5DLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLlJsKCksYz10aGlzLmIudS5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsCiJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLm1nKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5CKTt0aGlzLkMuc3JjPWE7ZS5wZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEuaGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ObyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLk9vKCksdGhpcy5hLmhjKCEwKSwhdGhpcy5VYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy5DLApjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmhjKCEwKSx0aGlzLlNvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5XbygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhvKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlRvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5kYyk7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goYyl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLmxlLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuUG8oKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5XYyYmKHRoaXMuUWY9ITEsdGhpcy5uYygpKSx0aGlzLlFvKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLk5iKCJtdXRlZCIsInVzZXIiKSxlLm8oay56ZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSGYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLnBlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe2UuaWEodGhpcy5DLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sUG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLmplLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnFjPSEwfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmJkLHRoaXMuYi51LAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMucWM9ITF9LFNvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sUm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sT286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5XaCgpO2UubyhrLmJnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2UubyhrLmJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuc2Q9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLlpmLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5WYSgibWlkcG9pbnQiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsuaGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLktmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sc2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5DJiZ0aGlzLkMucGFyZW50Tm9kZSYmdGhpcy5DLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGM9dGhpcy5DLnBhcmVudE5vZGU7dGhpcy5DLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DKTtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyk7CmUudWUoKTt0aGlzLkM9ITE7dGhpcy5QYShhKX19LE5vOmZ1bmN0aW9uKGEpe3ZhciBjPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWMmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGM9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGMubWF0Y2goZCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLm8oay5Zbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuc2koITApfSx2azpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkhhJiZiLmlzRW5hYmxlZCYmIWIuTGMoKSl7dmFyIGM9Yi50YShhKTtyZXR1cm4gYy5wcm90b2NvbCsiOi8vIitjLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9ZChjLHRoaXMuQik7Zi5vbmVycm9yPXRoaXMuS28uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoYyx0aGlzLkIpKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LHlrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm9pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMub2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5NZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sb2k6ZnVuY3Rpb24oYSl7dGhpcy5lY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjfHx0aGlzLk1mKGEpfS5iaW5kKHRoaXMpLHRoaXMuQ2spKX0sTWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2QmJnRoaXMuZGkodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5lYyl7dGhpcy5nZD0hMDt0cnl7aWYoIWUuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRmQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5XYSgpLCEwKSx0aGlzLkIuRmd8fHRoaXMuQi5kYSgidmlkZW8tbm9vcCIpKTt0aGlzLlBhKCk7cmV0dXJufX1jYXRjaChjKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5XYSgpLCEwKX10aGlzLkhvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEueWYoKTt0aGlzLkdvKCk7dGhpcy5uaSgpO3RoaXMubmcoKTt0aGlzLmEuRWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuQ2YoKX19LENmOmZ1bmN0aW9uKCl7dGhpcy5uZHx8dGhpcy4kZigpfSwkZjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZpZGVvLnBsYXkoKTtpZihjJiZjWyJjYXRjaCJdKWNbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLm5kfHwoYT90aGlzLlBhKCk6KHRoaXMuYWYoITApLHRoaXMuJGYoITApKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYy5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfS5iaW5kKHRoaXMpO3RoaXMuRWUoKS5TaCh0aGlzKX0sS2Y6ZnVuY3Rpb24oKXt0aGlzLkIuJGEmJiF0aGlzLkpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5vKGsucGssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlBhKCl9LHNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkPSExLGY9MDtmPGEubGVuZ3RoO2YrKylkPWUuV2coYVtmXSksYy5wdXNoKGQpO2E9e2hhc2hlczpjfTthPWsuUmEoYSx0aGlzLnMoKSk7ZS5TbihhKX0sUGE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuV2QmJnRoaXMuc2sodGhpcy5iLldkKTsKaWYoIXRoaXMudmUpaWYodGhpcy52ZT0hMCx0aGlzLlZkfHwoZS5vKGsuT20sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmIud2J8fHRoaXMuYi50Yyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5CZisrO3RoaXMuZWM9dGhpcy5nZD0hMTt0cnl7dGhpcy5GZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMucmEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSmQ9ITE7dHJ5e3RoaXMuYS5saSgpfWNhdGNoKGgpe310aGlzLkxkPSEwO3RoaXMuYS5JZSgpO3RoaXMuamM9ITE7dGhpcy5FZSgpLk9oKCk7dGhpcy5iLndiJiZ0aGlzLmIub3JpZ2luLmJmKCk7dGhpcy5iLnRjJiYoYT90aGlzLmIub3JpZ2luLnloKCk6dGhpcy53ZSgpKX1lbHNlIHRoaXMud2UoKX0sCktvOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRmQodGhpcy52aWRlbyksdGhpcy5MZihhKSl9LExmOmZ1bmN0aW9uKGEpe3RoaXMuZWM9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5CLk5rKCk7dGhpcy5iLm9yaWdpbi5IZyh3LiRkKX0scGk6ZnVuY3Rpb24oKXtpZih0aGlzLnFvKXRoaXMuUGEoKTtlbHNle3RoaXMuamM9ITA7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMudW8oYSk7aWYoIXRoaXMuVWIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpjLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9ZD0iIjt0aGlzLmIuQWYmJihjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVWgpKSYmKGQ9dGhpcy5iLkFmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5KZHx8KHRoaXMuSmQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLmIud2I/KHRoaXMuZWM9dGhpcy5nZD0hMSx0aGlzLkZkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSmQ9ITEsdGhpcy5hLmxpKCksdGhpcy5iLm9yaWdpbi5iZigpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLm5lPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saWk6ZnVuY3Rpb24oKXt0aGlzLkRofHwodGhpcy5EaD0hMCx0aGlzLnNkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sdW86ZnVuY3Rpb24oYSl7ZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthPT10aGlzLmppfHx0aGlzLkpifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fAp0aGlzLldoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkIuJGEmJnRoaXMuVmEoInN0YXJ0IiksZS5vKGsuYmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSxlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnNkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS5vKGsuWmYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUubyhrLmhnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLHRoaXMuamk9YSl9LFZoOmZ1bmN0aW9uKGEsYyl7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGMsITApfSxVbjpmdW5jdGlvbigpe2UuUWQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sV2g6ZnVuY3Rpb24oKXtlLlFkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFZuOmZ1bmN0aW9uKCl7ZS5RZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlFkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFZhOmZ1bmN0aW9uKGEpeyh0aGlzLlBmfHx0aGlzLkIuJGEpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5XYSgpLCEwKX0sTmI6ZnVuY3Rpb24oYSxjKXt0aGlzLkIuJGEmJmUudHJhY2soInN0YXRzX2hkXyIrYSxjLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxjKXtpZighdGhpcy5KYil7dGhpcy5jZiYmdGhpcy5jZi50cmFjayYmdGhpcy5jZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmUueGUmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPQohMH12YXIgZD1bXTt0cnl7ZD10aGlzLlBsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMucmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5LZC5pbXByZXNzaW9ucyYmZS5pbShoLnVybCx0aGlzLktkLmltcHJlc3Npb25zKT90aGlzLlZlKGgudXJsLGgudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLm8oay5xayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCkse2FkSWQ6dGhpcy5LZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5zKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuVmUoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWMpdHJ5e3RoaXMuYi5NYT10aGlzLmNsKHRoaXMuYi5NYSxhKX1jYXRjaChtKXt9fX0sV2E6ZnVuY3Rpb24oKXt2YXIgYT1lLlNhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLApjPSIiO3RoaXMuUGYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFZlOmZ1bmN0aW9uKGEsYyxkLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGM9dGhpcy5CLnZhKGEpLGQmJmMudWsoZCksZnx8KGY9dGhpcy5FZyksZXx8KGU9dGhpcy5FZyksdGhpcy53ayhhKSx0aGlzLkIuSWEoYyxmdW5jdGlvbigpe3RoaXMuTmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sd2s6ZnVuY3Rpb24oYSl7dGhpcy5sY1thXT0ib3BlbiJ9LE5oOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09ImNsb3NlZCJ9LFZrOmZ1bmN0aW9uKCl7dGhpcy5sYz17fX0sWG46ZnVuY3Rpb24oKXt2YXIgYT0wLGM7Zm9yKGMgaW4gdGhpcy5sYyl0aGlzLmxjLmhhc093blByb3BlcnR5KGMpJiYib3BlbiI9PXRoaXMubGNbY10mJmErKztyZXR1cm4gYX0sUGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09CmN9KX0sY2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWN9KX0sSG86ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLklvLmJpbmQodGhpcykpfSxJbzpmdW5jdGlvbigpe2UuU2EoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMubmMoKTp0aGlzLmIuZGMmJihlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt0cnl7dmFyIGM9d2luZG93Lm9wZW4oIiIsYSk7Yy5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZj0KdGhpcy5iLmRjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5kYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LEdvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0KImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5CLmpkJiYoYz10aGlzLkIuamQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGIuYmluZCh0aGlzKSwxRTMqYyk7dGhpcy5jYXB0aW9uPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSl9fSxEYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxIZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oYSl7aWYoIWUuRGYodGhpcy5jb250cm9scykpe3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy4kazt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5LYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5laS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGguc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixoLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuSWI7aC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9oLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnNvLmJpbmQodGhpcykpOmguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucm8uYmluZCh0aGlzKSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSGQoKX0uYmluZCh0aGlzKSk7CmguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuQWYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuU2EoKXx8KHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkhkKCl9LmJpbmQodGhpcykpLHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChkKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsCmMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMueGEmJih0aGlzLnhhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApjLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsueWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLmFmKCkpO3RoaXMuRWIoKX19LEViOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbmM6ZnVuY3Rpb24oKXsiaGlkZGVuIj09dGhpcy5jb250cm9scy5zdHlsZS52aXNpYmlsaXR5fHx0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuUWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkPwoodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSl9LGZpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5xYz8oZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMucWM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZHx8KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWQmJih0aGlzLmEuQS5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsCiEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0scm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZD8odGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5OYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy51Yj8oZS5pYSh0aGlzLkMsCiJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJtdXRlIiksdGhpcy51Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxhZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkfHwodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHdvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQmJih0aGlzLmEuQS5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksdGhpcy5OYigidW5tdXRlZCIsImNvbnRlbnQiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sbWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMpO3RoaXMubmR8fHRoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMucm0oKSYmdGhpcy5xbSgpJiYodGhpcy5CLnNjfHwic3BpZWdlbC5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYicHJlcm9sbCI9PWUuR2ImJnRoaXMudm8oKXx8KHRoaXMubmQ9ITAsdGhpcy54YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54YiksdGhpcy54Yj0hMSksdGhpcy56ZygpKX0scm06ZnVuY3Rpb24oKXt2YXIgYT0KZS5xZCgpO3JldHVybiB0aGlzLkIuVmImJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0scW06ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciIT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5lZnx8KGE9ITAsYy5hZEZhbGxiYWNrVVJMfHwoYy5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3JldHVybihhfHwhdGhpcy5yZSYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuZWZ9LEVsOmZ1bmN0aW9uKCl7dmFyIGE9bS5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpO3JldHVybiBhfSx2bzpmdW5jdGlvbigpe20uZ2V0Q29uZmlnKCk7CnRoaXMuZWY9dGhpcy5XYz10aGlzLlFmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLldhKCksITApO3RoaXMucmU9ITA7dmFyIGE9dGhpcy5FbCgpLGE9ZS5tZyhhLHRoaXMuQiwhMSx7b25seVVSTDohMH0pO2lmKCFhKXJldHVybiExO3RoaXMuV2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtyZXR1cm4hMH0semc6ZnVuY3Rpb24oYSl7dGhpcy5YbigpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemcoITApfS5iaW5kKHRoaXMpLHRoaXMuUm0pOih0aGlzLkxkPSEwLHRoaXMuYS5JZSgpLHRoaXMuYS51bigpLHRoaXMuamM9ITEsZS5vKGsuWmssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLkVlKCkuT2goKSl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYSgibWluVmlzIik7CmEmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5RaCgpOnRoaXMuQmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5kYyxhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi53Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnZjJiYwPHRoaXMudmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnZjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLkdrKyItIit0aGlzLkJmO3RoaXMuYiYmdGhpcy5iLlhnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPQp0aGlzLmIuWGcoKSk7cmV0dXJuIGF9LEVnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5hanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5DbXx8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5sYT1udWxsO3RoaXMuVj1bXTt0aGlzLko9bnVsbDt0aGlzLnVjPXRoaXMud2M9ITE7dGhpcy5tYT0iIjt0aGlzLk9mPSExO3RoaXMuaGg9IiI7ZCYmZC5lbXB0eT90aGlzLkFtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfQp2YXIgYj0wLGcsZD1bXTtjLmFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnFkKCksYjtiPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOm0udmEobS5NZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGUuRigibWFydGhhc3Rld2FydC5jb20iKXx8ZS5GKCJmYW5kb20uY29tIil8fGUuRigiZ2lnYS5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCkpe3ZhciBoPWUuQmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPT09CmguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihkKCl8fGcoKXx8aygpfHwiYXBwc3BvdCI9PWMpbCgpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uTWQoaCkpKyImdHlwZT1qcyIsYj1tLnZhKG0uTWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGUudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPW0udmEobS5NZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy56bS5iaW5kKHRoaXMpLHRoaXMud20uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLmxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5HYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuR2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkdifHx0aGlzLm9tKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLmNvKCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7CnZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09Zy5maXJzdENoaWxkO2MucHVzaChnKX1jYXRjaChoKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9tOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sCmM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sem06ZnVuY3Rpb24oYSl7dGhpcy5jbihhKTt0cnl7dGhpcy5sYT1hLnJlc3BvbnNlWE1MLHRoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj0KdGhpcy5TZygpO3RoaXMud2M9dGhpcy5FZigpO3RoaXMudWM9dGhpcy5haSgpO3RoaXMuaGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLk9jKCk7ZWxzZXt0aGlzLnFhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5PZj9ELmNlOkQuVGZ9KSk7dHJ5e2UudHJhY2soInN0YXRzX2hkX210eXVybCIsZS5DYih0aGlzLm1hKSwhMCl9Y2F0Y2goYyl7fX19LEFtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj10aGlzLlNnKCk7dGhpcy53Yz10aGlzLkVmKCk7dGhpcy51Yz10aGlzLmFpKCk7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuT2Y/RC5jZTpELlRmfSkpfSx3bTpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5RYSh3LlNmLHtkZXB0aDpifSkpfSwKT2M6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy5zbSgpP3RoaXMubW8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5iaCgpLGcse0FkU3lzdGVtOnRoaXMud2woKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlFhKHcuVmYpKTooYj0wLHRoaXMuem8oKSYmdGhpcy5oZih0aGlzLmJsKCkpKX0sYmY6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LmJmKCl9LHloOmZ1bmN0aW9uKCl7dGhpcy51Yz8odGhpcy51Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC55aCgpfSx6bzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpvKCk/dGhpcy5pbygpPyEwOigtMSE9dGhpcy5HYygpP3RoaXMucWEodGhpcy5RYSh3LlhkKSk6dGhpcy5xYSh0aGlzLlFhKHcuUmYpKSwhMSk6KHRoaXMucWEodGhpcy5RYSh3LlljLApELlVmKSksITEpfSxoZjpmdW5jdGlvbihhKXt0aGlzLm1hfHwodGhpcy5tYT0iIik7YS5XZHx8KGEuV2Q9W10pO2EuV2QucHVzaCh0aGlzLmhoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuWWUoKSk7YS53Yj1hLndiP2Eud2I6dGhpcy53YzthLnRjPWEudGM/YS50Yzp0aGlzLnVjO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZzt0aGlzLnBhcmVudC5oZihhKX0sYmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgUmE7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuZHVyYXRpb249dGhpcy5HYygpO2EuTT10aGlzLlpnKCk7YS5kYz10aGlzLnpsKCk7YS5rcT1bXTthLm9yaWdpbj10aGlzO2EudT10aGlzLnZsKCk7YS5BZj10aGlzLk5sKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8Cih0aGlzLm1hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuT2c7aWYoIXRoaXMuSiYmdGhpcy5sYSYmdGhpcy5sYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLmxhO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGM9ITE7KGM9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmYy5sZW5ndGgmJmUudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuTWE9YS5lcnJvci5jb2RlIT13LlhkLmNvZGU/YS5NYS5jb25jYXQodGhpcy5BbCgpKTphLk1hLmNvbmNhdCh0aGlzLkpsKCkpKTt0aGlzLlYubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYyYmdGhpcy5wYXJlbnQuZmMoYSksYj0wLHRoaXMuT2MoKSk6Cih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5xYSYmdGhpcy5wYXJlbnQucWEoYSksYj0wKX0sZmM6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZmMoYSl9LEhnOmZ1bmN0aW9uKGEsYil7dGhpcy5xYSh0aGlzLlFhKGEsYikpfSxRYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBTYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIGI8Z30sam86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlpnKCkubGVuZ3RofSxpbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuR2MoKX0sRWY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlYuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxhaTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuViYmMjw9dGhpcy5WLmxlbmd0aCYmCiF0aGlzLkVmKCkmJihhPSEwKTtyZXR1cm4gYX0sY246ZnVuY3Rpb24oYSl7dGhpcy5tYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm1hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubWE9IlVOS05PV04ifXRyeXt0aGlzLk9mPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSx3bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sWWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMub2goYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLm9oKGEucGFyZW50Tm9kZSk6ITF9LEpsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEFsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx6bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxPYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksRXA6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuT2F8fDFFMzt0cnl7dmFyIGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksYj1nLmNvbmNhdChlKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMudWQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sTmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5SbihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LERlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sR2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMudWQoYSk6IiJ9LHVkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLkdlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ha3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmxqfHxUYTtuZXcgVGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk1hPVtdO3RoaXMuTT1bXTt0aGlzLmRjPSIiO3RoaXMudT10aGlzLnRjPXRoaXMud2I9ITE7dGhpcy5LZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuTGU9IiJ9Yy5Kaj1hO2EucHJvdG90eXBlPXtXazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxIbDpmdW5jdGlvbigpe2lmKCF0aGlzLktlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubGEpe3ZhciBhPXRoaXMub3JpZ2luLmxhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGM9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1jLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLktlPWFbZF0pfXJldHVybiB0aGlzLktlfSxYZzpmdW5jdGlvbigpe2lmKHRoaXMuTGUpcmV0dXJuIHRoaXMuTGU7dmFyIGE9IiI7KGE9dGhpcy5IbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuTGU9YX0sUmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bY107cmV0dXJuIGF9fX0pKGMpO3ZhciBSYT1jLkpqfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkxpfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e2VlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLExhOiJYTUxfUEFSU0VfRVJST1IifSxSZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTGE6IkRVUkFUSU9OX0VSUk9SIn0sWWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLExhOiJFTVBUWV9WQVNUIn0sVmY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkxhOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxTZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixMYToiTE9BRF9FUlJPUiJ9LCRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixMYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LAplcDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixMYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTGE6IkRVTU1ZX0FEIn19LEQ9e1RmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTGE6Ik5PX0FEUyJ9LFVmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixMYToiTk9fTUVESUFGSUxFUyJ9LGZwOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLExhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sY2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlvPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFZhPWMueW98fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5lcnJvcj1hO3RoaXMucGQ9Yzt0aGlzLk1hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFNhPWMuT2l8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMuTml8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5QaD1hO3RoaXMudmlkZW89Yzt0aGlzLlRkPVtdO3RoaXMuTWg9W107dGhpcy5kZj1bXTt0aGlzLkpvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSygpfWMuZ3A9YTthLnByb3RvdHlwZT17SzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5QaC5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLlBoW2FdLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suWnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmhuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5UZC5wdXNoKHtzcmM6ZCxmcmFtZTpoLFNtOmUsdmVuZG9yOmMuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7Yzx0aGlzLmRmLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuZGZbY107ZC50eXBlPT09YSYmZC5Jayh0aGlzLkJsKGEpKX19LApCbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpcTohMCxocTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntWcDoidmlkZW8iLGxxOiJqc0N1c3RvbSIsbXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxucToxLEZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sClFsOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5UZC5sZW5ndGg7YysrKWlmKHRoaXMuVGRbY10udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5UZFtjXS5TbTtyZXR1cm4iIn0scm46ZnVuY3Rpb24oYSxjKXt0aGlzLk1oLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlFsKGMpLHZlbmRvcjpjfSk7dGhpcy5UbigpfSxobjpmdW5jdGlvbihhLGMpeyJ2aWRlbyI9PT1hP3RoaXMuSm8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMua2coYSxjKX0uYmluZCh0aGlzKSk6dGhpcy5rZyhhLGMpfSxrZzpmdW5jdGlvbihhLGMpe3RoaXMuZGYucHVzaCh7dHlwZTphLElrOmMsZnE6ITF9KX0sVG46ZnVuY3Rpb24oKXt0aGlzLk1oLm1hcChmdW5jdGlvbihhKXthLmxtfHwoYS5ZcCh7YWRTZXNzaW9uSWQ6ZS5YKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5qcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmxtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMudG18fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMua2I9YS5UZygpO3RoaXMuST1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkkuaWQ9ZS5YKDEwKTt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5OYT17fTt0aGlzLmxnPSExOwp0aGlzLmFjPVtdfWMuS2k9YTthLnByb3RvdHlwZT17dWw6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxlPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGU9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6ZSx5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy51bChhKTtmb3IodmFyIGM9MCxkPTAsZT0hMSxoPXRoaXMuWmwoYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMH0sbGk6ZnVuY3Rpb24oKXt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEVoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5jLmwoKSl9LHVuOmZ1bmN0aW9uKCl7dGhpcy5sZ3x8Cih0aGlzLmMucGxheSgpLGUubyhrLm1kLHRoaXMuYy5sKCkpKX0seWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSS5zdHlsZS56SW5kZXg9YTt0aGlzLkkuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5JLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkkuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkkuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTsKdGhpcy5jLlJjJiZ0aGlzLmMuUmMoKT90aGlzLmMuVGcoKS5hcHBlbmRDaGlsZCh0aGlzLkkpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5JKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxabDpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gZH0sc2w6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTtjLnBvc2l0aW9uP2MucG9zaXRpb249Yy5wb3NpdGlvbjpjLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy53aWR0aD1hLm9mZnNldFdpZHRoO2MuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gY30saGM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zbCh0aGlzLmtiKTtpZihjLnghPXRoaXMuTmEueHx8Yy55IT10aGlzLk5hLnl8fGMucG9zaXRpb24hPXRoaXMuTmEucG9zaXRpb258fGMud2lkdGghPXRoaXMuTmEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLk5hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk5hLndpZHRoJiYwPHRoaXMuTmEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5JZSgpO3JldHVybn10aGlzLk5hPWM7dGhpcy5jLlJjKCk/KHRoaXMuSS5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSS5zdHlsZS50b3A9IjBweCIpOih0aGlzLkkuc3R5bGUubGVmdD1jLngrInB4Iix0aGlzLkkuc3R5bGUudG9wPWMueSsicHgiKTt0aGlzLkkuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9Yy5oZWlnaHQrInB4Ijt0aGlzLkkuc3R5bGUucG9zaXRpb249Yy5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuYWMubGVuZ3RoO2ErKyl0aGlzLmFjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWUuRGYodGhpcy5JKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5hY3x8KHRoaXMuYWM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmFjLnB1c2goYSl9LEllOmZ1bmN0aW9uKCl7dGhpcy5JJiZ0aGlzLkkucGFyZW50Tm9kZSYmdGhpcy5JLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSSk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuS2l8fFlhLEI9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPQplLlgoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgJGE9Yy5UaXx8JGE7bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5HZChhKTt0aGlzLkNnKCl9LEdkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYWI9Yy5Eanx8YWI7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWNhKCk7dGhpcy5ZYj10aGlzLllifHwhMTt0aGlzLmNnPXRoaXMuZWc9CnRoaXMubGg9dGhpcy51YT10aGlzLkdmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLkdmPSEwO3RoaXMubGgmJnRoaXMudWcoKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmpjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMua2QoKTt0aGlzLmxoPSEwO3RoaXMudWcoKX0uYmluZCh0aGlzKSk7CnRoaXMucGcoKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5ZYil7dGhpcy5rZCgpO2lmKCF0aGlzLkdmJiYhdGhpcy5rZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuR2YmJnRoaXMuY2cmJiF0aGlzLmVnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LCRnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGIubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1iLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YSlyZXR1cm4gZC5pbnN0YW5jZX19LHBnOmZ1bmN0aW9uKCl7aWYodGhpcy5rZCgpKXt2YXIgYT0KdGhpcy4kZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLmVnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuY2c9YS5DcH10aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLlRwKCk6ITF9LEdjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5HYygpOi0xfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxxbDpmdW5jdGlvbihhLGIpe3RoaXMuWWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuWWJ8fDMwMj09dGhpcy5ZYj90aGlzLnVhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5ZYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksMTAwKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE/KHRoaXMudygpLHRoaXMub2EoKSk6YS5NZSgpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLktsKGEpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuQ2p8fGJiOyhmdW5jdGlvbihjKXtjLkVqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbm06ZnVuY3Rpb24oKXt3aW5kb3cuT08uTmoubmsubGs/d2luZG93Lk9PLk5qLm5rLmxrLkFwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWNhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkZlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBhYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgYmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIGNiPWMuRWp8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMub289YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBlYj1jLm9vfHxlYjtuZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLkhoKCl9LEhoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5VJiYoMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcyksMTAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0scmc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmcoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMucmcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5yZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuRWl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sS2g6ZnVuY3Rpb24oYSl7YT1uZXcgZmIoYSk7YS5qYT90aGlzLlAoKTp0aGlzLkwoYSl8fChhLkdkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk4oYSksKG5ldyBnYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLnJsfHwodGhpcy5ybD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuS2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLktoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGhiPWMuR2l8fGhiLFM9bmV3IGhiKHIpO1MuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGliPWMuaGx8fGliO25ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFQ9Yy5Xanx8VDsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LmNkKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguY2QoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5QbShhKX0uYmluZCh0aGlzKSk7eC5jZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKTt4LmNkKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5VbCgpfSxQbTpmdW5jdGlvbihhKXt2YXIgYj0iIixjO2ZvcihjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7Yj1pc05hTihhW2NdKT8hMTphW2NdO2lmKDEwMDk9PWFbY118fDEwMDE9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKXt0aGlzLncoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2NdKWlmKGFbY10uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbY11bZF0pPyExOmFbY11bZF0sMTAwOT09YVtjXVtkXXx8CjEwMDE9PWFbY11bZF18fDMwMz09YVtjXVtkXXx8NDAzPT1hW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkQoKX19KX0pKGMpO3ZhciBVPWMuVmp8fFU7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO3RoaXMuQWQmJihhPWUuZGwoYSx0aGlzLkFkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFQoZCk7aWYoIXRoaXMuTChkKSl7dGhpcy5OKGQpOwp2YXIgZj1uZXcgVShkLHRoaXMuRyk7Zi5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuQWR8fCh0aGlzLkFkPVtdKSx0aGlzLkFkLnB1c2goYVtiXSksZD1uZXcgVChoKSx0aGlzLkwoZCl8fCh0aGlzLk4oZCksZj1uZXcgVShkLHRoaXMuRyksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxjZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGMpfSxubzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLk5jfHwKKHRoaXMuTmM9W10pLHRoaXMuTmMucHVzaChhKSx0aGlzLnRuKCkmJih0aGlzLnBmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bY10mJjA8dGhpcy5hYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmFhW2JdW2NdLmxlbmd0aDtkKyspdGhpcy5hYVtiXVtjXVtkXShhKX19LFVsOmZ1bmN0aW9uKCl7aWYodGhpcy5OYylmb3IodmFyIGE9MDthPHRoaXMuTmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5OY1thXSxjPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbY11bZF0mJjA8dGhpcy5hYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmFhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5hYVtjXVtkXVtlXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4Lm5vKGEpfX0pfSkoYyk7dmFyIGpiPWMuWGp8fGpiLHg9bmV3IGpiKHIpO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2I9Yy5ibnx8a2I7bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sd2E6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBsYj1jLkJpfHxsYjsoZnVuY3Rpb24oYyl7Yy5DaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkQoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbWI9Yy5DaXx8Cm1iOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbGIoZCk7dGhpcy5MKGgpfHwodGhpcy5OKGgpLChuZXcgbWIoaCx0aGlzLkcpKS5mKCkpfWNhdGNoKGspe319dGhpcy5QKCl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihiPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYj1jLk1pfHxwYjtuZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLndnPXRoaXMuRWM9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dmFyIGI9dGhpcy5KZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuRWM9Yik7aWYoIXRoaXMud2cmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fAphLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixhLnNvdXJjZS5DSE9PU0VSX0FCfHwiIiwhMCk7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixjLCEwKTt0aGlzLndnPSEwfX19Y2F0Y2goaCl7fX0uYmluZCh0aGlzKSk7dGhpcy5WZygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuZ24odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSxWZzpmdW5jdGlvbigpe2lmKHRoaXMuRWMpcmV0dXJuIHRoaXMuRWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuSmcoYSkpcmV0dXJuIHRoaXMuRWM9CmF9fSxKZzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiZhLnZpZGVvU2xvdCYmKGI9YSk7YSYmYS5oZHZwYWlkJiYoYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZ246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiYKdGhpcy5lYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5tdXRlJiZ0aGlzLmVhLm11dGUoKX0uYmluZCh0aGlzKSk7YSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sbWg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy55anx8cWI7KGZ1bmN0aW9uKGMpe2MueGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLnRpJiYodGhpcy5nKCksdGhpcy50aT0hMCx0aGlzLmthKCkpOwpiLkdhKCkuYWRkRXZlbnRMaXN0ZW5lcihhLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuVmcoKT90aGlzLkQoKToodGhpcy55ZXx8KHRoaXMueWU9MSksdGhpcy55ZSsrLDEwMDx0aGlzLnllP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy54anx8cmI7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLkwoYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTsKdmFyIHNiPWMuemp8fHNiLFY9bmV3IHNiKHIpO1YuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5RbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRiPWMuUW18fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5VPygwLHRoaXMuVSkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZmt8fHViOyhmdW5jdGlvbihjKXtjLmVrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEljOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSwKYT1hLmdldFJhd1BsYXllcigpO3JldHVybiBhLmltYUFkc0xvYWRlcn0sZW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMub2EoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMuZ2V0UGxheWVyKCk7CnRoaXMuQmE/dGhpcy5lbih0aGlzLkJhKToodGhpcy5CYT10aGlzLkljKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuRCgpO3JldHVybn1pZighdGhpcy54Yyl7dGhpcy5EKCk7cmV0dXJufWE9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmViLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmViW2JdJiYzMDMhPXRoaXMuZWJbYl0mJjQwMyE9dGhpcy5lYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMub2EoKTtlbHNle3RoaXMuRCgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZWt8fHZiOyhmdW5jdGlvbihjKXtjLmdrPQp0LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlRhPS0xO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5MKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuZ2t8fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmJtfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuamY9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLldtKCl9LmJpbmQodGhpcyksNTAwKX0sV206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5VJiZ0aGlzLlUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksCmI9MDthLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYj1hLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuamYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuamYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXbjpmdW5jdGlvbigpe3RoaXMuamY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLlJqfHwKemI7KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnBjPTB9LGY6ZnVuY3Rpb24oKXt0aGlzLkVtPTEwO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5wY3x8KHRoaXMucGM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5nKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5wY3x8dGhpcy5wYysrLHRoaXMucGM8PXRoaXMuRW0/KHRoaXMucGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5XbigpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5Ranx8QWI7KGZ1bmN0aW9uKGMpe2MuU2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSwKdGhpcy5HKSkuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgQmI9Yy5Tanx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIERiPWMueG98fERiO25ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0iIjthLmN1cnJlbnRUaW1lJiYoYj1hLmN1cnJlbnRUaW1lKTtyZXR1cm4gYn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sS2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5VKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuUGp8fEViOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5HYSgpLGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZztiJiZiLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7YS5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5CYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMudW0oKTp0aGlzLnRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5nKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LFhrOmZ1bmN0aW9uKCl7dGhpcy5hZygpfHx0aGlzLmcoITApfSx1bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQmIoKTshYS5uYSYmYS5WJiZhLnpwJiZhLkJwJiYodGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZygpKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7YS5hZHNMb2FkZXI/YS5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2gpZm9yKHZhciBhPQpjLlpjLkJiKCksYj10aGlzLmdldFBsYXllcigpLkdhKCkuaWQsZT0wO2U8YS5sZW5ndGg7ZSsrKWFbZV0uaWQ9PWImJih0aGlzLkNoPWFbZV0pO3JldHVybiB0aGlzLkNofSxVcDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxnOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2E/dGhpcy5CYigpLmFkc0xvYWRlcj90aGlzLkQoITApOnRoaXMuRCgpOnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLk9qfHxGYjsoZnVuY3Rpb24oYyl7Yy5aYz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBrOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgRmIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Yy5aYy5CYigpO2lmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuUGsoYVtiXSk7dGhpcy5QKCl9fSk7Yy5aYy5CYj1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKGwmJmwucGxheWVyYXBpJiYoYT1sLnBsYXllcmFwaSgpKSYmYS5sZW5ndGgpcmV0dXJuIGE7dmFyIGE9W10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSwKYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCksYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kKTtpZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5aY3x8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuJGl8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnVqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RSYmKGE9YS5maXJzdENoaWxkKTtpZihhKXt0aGlzLlQoYSk7aWYoYS50YWdOYW1lKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1iP3RoaXMuVyhiKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxTcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYzpmdW5jdGlvbigpe3JldHVybiEwfSxHYTpmdW5jdGlvbigpe3ZhciBhO0U/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9CmMudWp8fFc7KGZ1bmN0aW9uKGMpe2MudGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMua2Y9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5rZj1hLmlkKTtFP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLmtmJiZjIT10aGlzLmtmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuJHApLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy50anx8WDsoZnVuY3Rpb24oYyl7Yy52aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRSlmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBXKGEpLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBYKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmphP3RoaXMucGYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEUsSmI9Yy52anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLlVtfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5ZaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLApjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlooKSk6dGhpcy5aKCk6dGhpcy5aKCk6dGhpcy5aKCl9LHduOmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxYcDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBNYj1jLllpfHxNYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5xZygpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMua2EoKX0uYmluZCh0aGlzKSl9LHFnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLkdldEFkRXJyb3JzQ2FjaGUoKSxjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5oYW5kbGVFcnJvcihiW2NdKTthLkNsZWFyQWRFcnJvcnNDYWNoZSgpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT0KYSl0aGlzLnFnKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuZygpKX19LGc6ZnVuY3Rpb24oYSl7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIE5iPWMuWGl8fE5iOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7YXx8KGE9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYSYmYS5HZXRBbGxQbGF5ZXJzJiYoYT1hLkdldEFsbFBsYXllcnMoKSkmJjA8YS5sZW5ndGgpZm9yKHZhciBiPQowO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTWIoYVtiXSk7Yy5qYXx8dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgTmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIE9iPWMuWml8fE9iLFBiPW5ldyBPYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYj1jLkltfHxRYjtuZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTsKYnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWigpfSxSZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sZm46ZnVuY3Rpb24oKXt0aGlzLlhjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWGN8fCh0aGlzLlhjPSEwLHRoaXMuUmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlhjJiYodGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlhjPSExKSx0aGlzLlJkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgUmI9Yy5qa3x8UmI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sTGg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxoLmJpbmQodGhpcyksMTApfSxiYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMub2s9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuZygpKToodGhpcy5va3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuZygpKX0sWWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuYmMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLllmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuTGgoKTt0aGlzLllmKCk7dGhpcy5qbigpfSxqbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmRuP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLmRuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuYmMoYSkpfX0pfSkoYyk7dmFyIFNiPWMuaWt8fFNiOyhmdW5jdGlvbihjKXtjLmtrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEuZm4oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgVGI9Yy5ra3x8VGIsVWI9bmV3IFRiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLmpsfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLkZoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLkptPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX1lbHNlIHRoaXMuWigpfSx3bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KbX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUGQoYSl9LmJpbmQodGhpcykpfSxQZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5GaCYmKHRoaXMuRmg9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLlpqfHxOOyhmdW5jdGlvbihjKXtjLllqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5CZSlpZih0aGlzLkhifHwKKHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuSm4oKTp0aGlzLmcoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuZygpOnRoaXMuZyghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkJlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuY2EoYSk7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5Zanx8TzsoZnVuY3Rpb24oYyl7Yy4kaj0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVGE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5wZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFdiPWMuJGp8fFdiLFhiPW5ldyBXYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYj1jLkVrfHxZYjtuZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnFqfHxZOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmloPTA7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmVkPSExO3RoaXMuSmg9ZS5MYigxMCk7dGhpcy5xaCgpfSxxaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnNiKCksITA7dGhpcy5paCsrO2lmKDEwPHRoaXMuaWgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuZyghMCk6dGhpcy5nKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5xaC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLnVhPQohMH0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgWj1jLnBqfHxaOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWSh3aW5kb3cucGxheWVyKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLnJqfHxaYiwkYj1uZXcgWmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy4kbHx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5WaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2coKX0sc2c6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBjYz1jLlVpfHwKY2M7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmphKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYz1jLldpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmM9Yy5Va3x8ZmM7bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLndpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy53aXx8Z2M7KGZ1bmN0aW9uKGMpe2Mudmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpO3RoaXMuc2UoKTt0aGlzLm9nKCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LENhOmZ1bmN0aW9uKCl7dGhpcy51YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sb2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5vYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9nLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuc2UuYmluZCh0aGlzKSwxMDApfSxzZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMudml8fGhjOyhmdW5jdGlvbihjKXtjLnhpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT0KbmV3IGdjKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgaGMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuUmEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlJhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMueGl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLm5sfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMucmg9dGhpcy50aD10aGlzLnNoPSExO3RoaXMuQ2Q9W107dGhpcy5vZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHphP251bGw6emEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgUz9udWxsOlMsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFViP251bGw6VWIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Maj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLkxsKGEpOltdLGM7dGhpcy50aD0hMDtpZihhLmxlbmd0aCl7dGhpcy5zaD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sCnRoaXMuUmgoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLm9mKXtpZih0aGlzLnJoKWJyZWFrO2M9dGhpcy5vZltkXTt0aGlzLkpmKGMpJiYodGhpcy5DZC5wdXNoKGMpLHRoaXMuUmgoYykpfX0sSmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxMbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZD1hW2VdLGQ9dGhpcy5vZltkXSx0aGlzLkpmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LFJoOmZ1bmN0aW9uKGEpe3RoaXMuSmYoYSkmJmEuZigpfSxZbjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuc2gpZm9yKHRoaXMucmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uU2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5TYil9fX0pKGMpO3ZhciBsYz1jLkxqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5nbHx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRmMoay5BbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsCmMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTt2YXIgRz1uZXcgSCxsPSExO0cuZmEoKTtHLm5oKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5mYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcubmgoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LAohMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuTmcod2luZG93LEcuZG0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5TaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy54ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTt0aGlzLkVkPTA7dGhpcy5JaD0hMTt0aGlzLmxmPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnlpPWE7YS5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3RoaXMuR2g9YX0sdmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmJiPXRoaXMucGxheWVyLlIoKX0sCmdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQW46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx6bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTsKdmFyIGQ9ITEsZj0hMTtpZih0aGlzLmVtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5wYSx0aGlzLm5iLm5mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMudm4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuJG4oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsaCk7bC54bih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuRG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5TaChsKX19LGVtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy54ZC5nZXRUaW1lKCksdGhpcy54ZD1hLDNFNTxjPyEwOiExO3RoaXMueGQ9YTtyZXR1cm4hMX0sUW46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS51ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLklnKGEpKT90aGlzLlNjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksCjApLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfSxQbjpmdW5jdGlvbihhKXtpZighdGhpcy5HaCl7ZS51ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuRm4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSWcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsubWQsdGhpcy5wbGF5ZXIubCgpKSl9fSxJZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sbW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Nbih0aGlzLlBuLmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5LYSgpfSxJZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS51ZigibWlkcm9sbCIpO2lmKCF0aGlzLndoKXt0aGlzLndoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfX0sbG46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Fbih0aGlzLklkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlplKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlFuKCk7dGhpcy5wbGF5ZXIuWmUmJnRoaXMubG4oKTt0aGlzLm1uKCl9LG5uOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkRkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5jcChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRWQ9dGhpcy5EZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkVkJiYoYT0hMCk7cmV0dXJuIGF9LHZuOmZ1bmN0aW9uKGEpe3RoaXMuSWg9YTtmb3IoYT0wO2E8dGhpcy5EZC5sZW5ndGg7YSsrKXRoaXMuRGRbYV1bImZ1bmN0aW9uIl0odGhpcy4kbS5iaW5kKHRoaXMpKX0sJG06ZnVuY3Rpb24oYSl7dGhpcy5FZC0tO2EmJnRoaXMubGYucHVzaChhKTswPj10aGlzLkVkJiZ0aGlzLkloKCl9LERtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLmxmLmxlbmd0aDtkKyspYz0KdGhpcy5sZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy55aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnBsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoZWVCaWNoYWhNaWFNZWVHaCxlZUJpY2hhaE1pYU1lZUdoKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.225.78.95
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-13-225-78-95.fra2.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- b1ae253cba132ab2566227a6f5a59ea9a90cdffef6f6bf06c55a222ed3afef53
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.giga.de/bb14bce17282106e97f126651f0f40b9441ab351/
Frame 34FB
|
724 B
2 KB
|
141ms
107ms
|
XHR
application/json |
144.76.115.236
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.giga.de/bb14bce17282106e97f126651f0f40b9441ab351/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGVlQmljaGFoTWlhTWVlR2g9ZWVCaWNoYWhNaWFNZWVHaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZmZ8fCh4LmZmPTApO3guZmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5mZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5IayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2IudmYoYyk7Yi5BbihtKTtiLnpuKGwpO2Iubm4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Jbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS51aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5pbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGs9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlptLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5naD17fTt0aGlzLnNmPSExfWMuY2o9YTthLnByb3RvdHlwZT17Wm46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnNmfHwodGhpcy5zZj1lLlgoMTApKTtyZXR1cm4gdGhpcy5zZn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmdoW2JdJiYodGhpcy5naFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlpuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx6azpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sWm06ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuWW0oYi5kYXRhKX0sWW06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxCZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5XZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMueWQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxXZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx4azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnRsKGIpKXJldHVybjsoYT10aGlzLkJnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx0bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFVnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxLbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHhmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuYWwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuS24oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sSms6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGFsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5KayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxEZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxwaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFRoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGttOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scWQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAphbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxGajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxoazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQWkoKXx8Yi5IaSgpfHxiLmFtKCl8fGIuRmooKXx8Yi5oaygpfHxiLnNqKCl8fGIuVWooKX19O3JldHVybiBudWxsIT1iLkRrKCl9LHlsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxkbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxSbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxRZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMua2koYSkrIjoiK3RoaXMua2koTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGtpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx1ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE5nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxhbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk1sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sU246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLnZhKGIsITApO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS52YShmLCEwKTtmPW0udmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFFkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uT2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnVkKGIpOiIifSx1ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG1nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5wbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnFmJiZ3aW5kb3cuc2FuZGJveC5xZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLkxnKGIpKXJldHVybiB0aGlzLkxnKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS53ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy54ayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHlkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5bTpmdW5jdGlvbihiLGEsZCl7dGhpcy55ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx1aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMueW0oZi53ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGNwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxGazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0saW06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmJqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWm89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5rbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmJwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuZ2c9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuWmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5kZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5oZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EucGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuYmc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Gbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS4kbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLlprPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5tZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5mZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eucms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5iZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnFrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5yaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuemQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS55Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuWW89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQm89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Bbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLmZsfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxJbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnRkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudGQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG5oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5JbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnRkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmRqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuSWk9YX0pKGMpO3ZhciBLPWMuSWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Ca3x8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Laj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5CbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scGY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sR2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudGgmJkwuWW4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxqbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLktqfHx0OyhmdW5jdGlvbihjKXtjLk1qPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5EZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTW46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRW46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sR2Q6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnRrKCk7dGhpcy5HZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHRrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxTaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LE9oOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkRnfHwodGhpcy5EZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLk1qfHxxOyhmdW5jdGlvbihjKXtjLnppPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuV2Y9IjEiO3RoaXMuWGY9IjIiO3RoaXMubWs9IjMiO3RoaXMuJGM9MDt0aGlzLkZtPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5pZz10aGlzLm1pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMudmYoYSk7dGhpcy5DbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm1pfHwodGhpcy5taT0hMCxlLlhlKCkpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGNtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0sZ206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMud2YoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmNtKCk7aWYoIXRoaXMuZ20oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMud2YoKTtyZXR1cm59dGhpcy53ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuZ2koKTt0aGlzLmlnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy56YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGdpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldmfSx3ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWGZ9LEpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ta30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxhZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5XZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWGZ9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx2ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxHbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEJtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy56aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Canx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLnRvfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuS2coKTt0aGlzLk1nKCk7dGhpcy5Zaz0hMX0sS2c6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5JZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSWQoYil9LmJpbmQodGhpcykpfSxJZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5uanx8cmE7KGZ1bmN0aW9uKGMpe2MubWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5rZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgZz0wO2c8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7ZysrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbZ10udGFnKXt0aGlzLnliPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueWI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMueWI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0KImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPGQubGVuZ3RoO2crKylhLm9uKGRbZ10sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtnXSYmKHRoaXMuaGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtnXSYmdGhpcy5BaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkZtJiYhdGhpcy56YSgpJiYodGhpcy55Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLApmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLllrPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5CZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmFkLmluZGV4T2YoYikmJnRoaXMuYWQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmFkLmxlbmd0aD49dGhpcy5rZSYmdGhpcy5nKCkpfSwKQm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRGYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmhlfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuS2coKSxiLk1nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLm1qfHxzYTsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT0KdGhpcy5DbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKWEucHVzaChiW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpO3RoaXMuTChnKXx8dGhpcy5qbShnKXx8KHRoaXMuTihnKSxnPW5ldyBzYShnLHRoaXMuRyksZy5LKCksZy5mKCkpfX10aGlzLlAoKX19LEpwOmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LENsOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihhLmFuY2hvcil9fSl9KShjKTt2YXIgdGE9Yy5vanx8dGEsdWE9bmV3IHRhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuYm98fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmNrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEpe3ZhciBiPWEuZWxfO2J8fChiPWEuZWwoKSk7Yj8odGhpcy5UKGIpLChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYSl7dGhpcy5QZChhKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFiWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuYXV0b3BsYXk/YS5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHdhPWMuY2t8fHdhOyhmdW5jdGlvbihjKXtjLmJrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5LYz10aGlzLkJhPXRoaXMuZWQ9ITE7dGhpcy5KaD1lLkxiKDEwKTt0aGlzLklmPSEwO3RoaXMueGM9dGhpcy5raD0hMTt0aGlzLkttKGEuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy56aCgpLHRoaXMuS2soKSx0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGEuViwiOyIsdHlwZW9mIGEuViwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYS5WP2EuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGEuVj90eXBlb2YgYS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYS5pbWEsIjsiLHR5cGVvZiBhLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGEuSCwiOyIsdHlwZW9mIGEuSCwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLmltYT9hLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5pbWEmJmEuaW1hLkVhP2EuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IixhLmltYSYmYS5pbWEuRWE/dHlwZW9mIGEuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5mZToKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixhLkg/YS5ILmZlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILmdlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZ2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/CnR5cGVvZiBhLkgubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5xZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuSmgpfSxIYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5pbWEzJiYodGhpcy5pbWE9YS5pbWEzKTtpZihhLmltYSl7dGhpcy5pbWE9YS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LEljOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmEpe3ZhciBhPXRoaXMuSGMoKTthJiYoYS5hZHNMb2FkZXImJih0aGlzLm5hPWEuYWRzTG9hZGVyKSxhLl9hZHNMb2FkZXImJih0aGlzLm5hPWEuX2Fkc0xvYWRlciksYS5nZXRBZHNMb2FkZXImJih0aGlzLm5hPWEuZ2V0QWRzTG9hZGVyKSxhLmNvbnRyb2xsZXImJmEuY29udHJvbGxlci5zZGtJbXBsJiZhLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm5hPWEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm5hfSxZZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGhtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuamgpe3ZhciBhPQp0aGlzLkhjKCksYj10aGlzLmZtKCk7d2luZG93LmltYSYmYSYmKGEuX2Fkc0xvYWRlcnx8YS5hZHNMb2FkZXJ8fGIpJiYodGhpcy5qaD0hMCl9cmV0dXJuIHRoaXMuamh9LGZtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5lZCYmYS5hZHMmJihhLmFkcy5zdGF0ZXx8YS5hZHMuX3N0YXRlKSYmKHRoaXMuZWQ9ITApO3JldHVybiB0aGlzLmVkfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWMoKTtpZihhKXt2YXIgYj0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rbigpfS5iaW5kKHRoaXMpKSwKYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxrbjpmdW5jdGlvbigpe3RoaXMueGM9ITA7dmFyIGE9dGhpcy5ZZygpO2lmKGF8fHRoaXMuemEoKSl7dmFyIGI9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5jYShiKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuU2EoKSYmKGQ9Ik1fIik7YS5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDsKaWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYi5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnljfHwodGhpcy5tKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5iYSgpLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LElwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5BZyYmYS5hZHMmJih0aGlzLkFnPWEuYWRzKTtyZXR1cm4gdGhpcy5BZ30sS2s6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7CnRoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLkFoKCl9LmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YSYmKChhPXRoaXMuWWcoKSkmJmEuZGVzdHJveT9hLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoKX0uYmluZCh0aGlzKSw1MCkpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcoKSYmMDxhLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5obSgpKXt2YXIgYj10aGlzLkhjKCksZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLncoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5raD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8KKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMua2g9ITA7YS5pc1BsYXlpbmcoKSYmMTA8YS5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDUwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sTGs6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpOwpyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGsoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIGUueGU/ITE6dGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXtpZih0aGlzLllsKCkpe3RoaXMudWE9ITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXRoaXMuSWY9ITEsZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsInNldCIsITApO3RoaXMuZyghMCl9ZWxzZSB0aGlzLnVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpfSxZbDpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPQohMTtlLnlkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2E9IWUuZmIoYi5jYyl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthPSExfSwhMCwhMCk7dmFyIGI9ZS55bCgpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUueGU9LTEhPWIuaW5kZXhPZigiZmlyZWZveCIpfHwtMSE9Yi5pbmRleE9mKCJzYWZhcmkiKXx8YX1yZXR1cm4hMX0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy56YSgpfHwoYXx8KHRoaXMuSWY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSWYsZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApUazpmdW5jdGlvbigpe3RoaXMuUnB8fCgxMDx0aGlzLkxvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuTG8rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5zbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxzbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Nbyl7dGhpcy5Nbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmEudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5kaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuWGgod2luZG93KTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl0cnl7Yj1ifHx0aGlzLlhoKGFbZ10pfWNhdGNoKGQpe310aGlzLlAoKX19LFhoOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTt2YXIgeWE9Yy5ka3x8eWEsemE9bmV3IHlhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Baj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEFhPWMuQWp8fEFhO25ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuZ2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTsKcmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5XKGEpOnRoaXMuWigpfSxWbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZiLGc9dGhpcy5oYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5qYyYmKDA8PWcuaW5kZXhPZihkKXx8Yi5CZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuZ2Y9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKd2E6ZnVuY3Rpb24oKXt0aGlzLmdmKys7aWYoMTA8dGhpcy5nZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgphJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7dmFyIEJhPWMuSGp8fEJhOyhmdW5jdGlvbihjKXtjLkdqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5IYisrLDE1PHRoaXMuSGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPQohMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpOwp2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm9sPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5vbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlZtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Hanx8Q2E7KGZ1bmN0aW9uKGMpe2MuSWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBCYShhW2JdKTtnLmphfHx0aGlzLkwoZyl8fCh0aGlzLk4oZyksKG5ldyBDYShnLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Janx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuVGx8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlVnKGEsImVsZW1lbnRJRCIpOwpzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLlhtPWEucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1hLndpZHRoO2cuc3R5bGUubWluV2lkdGg9YS53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5YbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5yZD1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMucmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnJkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sU2s6ZnVuY3Rpb24oKXtlLnBoKHRoaXMucmQpO2UuT2UodGhpcy5yZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5qanx8R2E7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaWp8fEhhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiYKbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5VZyhhLCJlbGVtZW50SUQiKTtpZihlLnBoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmtqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy53anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPQoiR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxEbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHVrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixnLGQsZil7dGhpcy5YYT1iO3RoaXMuUGc9dGhpcy51aT0hMTt0aGlzLkJoPWQ7dGhpcy5ZaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmCjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJm0mJm0uUmUodGhpcy5YYS51cmwpJiZtLlZjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5EbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiKwpkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlBnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0aGlzLmhiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5ZaD90aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy51aXx8KHRoaXMuaGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwKInJlcXVlc3RfZmFpbGVkIiwhMCk6bS5SZSh0aGlzLlhhLnVybCksdGhpcy5CaCYmdGhpcy5CaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9Yy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkRhPXRoaXMuYmU9ITF9Yy5KaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihiKXt0aGlzLmJlPWJ9LEduOmZ1bmN0aW9uKGIpe3RoaXMuRGE9Yn0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIiwicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIiwKdnA6IkFkU2tpcHBlZCIsd3A6IkFkU3RhcnRlZCIsbHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixtcDoiQWRJbXByZXNzaW9uIixpcDoiQWRDcmVhdGl2ZVZpZXciLHBwOiJBZFZpZGVvTWlkcG9pbnQiLHFwOiJBZFBhdXNlZCIsc3A6IkFkVmlkZW9TdGFydCIsdHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5iZSxhW2RdKX0scG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmFlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmFlKXRoaXMuRGEuYWUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuRGEsdGhpcy5EYS5hZVthXSk7dGhpcy5EYSYmdGhpcy5EYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYS5nZXRFcnJvcigpO2ImJmNvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsImdvdCBlcnJvciIsYil9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5iZSYmdGhpcy5xbigpO3RoaXMuRGEmJnRoaXMucG4oKX19fSkoYyk7dmFyIE1hPWMuSml8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IYT0hMTt0aGlzLiRiPSIiO3RoaXMuZmQ9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5HZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm5mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuWmQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7CnRoaXMuWWQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnZiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLldiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLlBiPSIiO3RoaXMuUWI9W107dGhpcy5SYj1bXTt0aGlzLlVjPVtdO3RoaXMub2M9IiI7dGhpcy5BYj0hMTt0aGlzLk9kPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaWM9ITE7dGhpcy52Zz10aGlzLlVkPW51bGw7dGhpcy56Zj10aGlzLlZiPXRoaXMuRmc9dGhpcy5TZD10aGlzLlZjPXRoaXMuaGQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnZkPTA7dGhpcy5maD0hMTt0aGlzLmVoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy4kYixhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlpiLGFkdGFncmVnZXg6dGhpcy5mZCxiaXRyYXRlOnRoaXMuT2EsanNwb3B1cHM6dGhpcy5UZSxzaWRlbG9hZHM6dGhpcy50YixkaXNhYmxldGVzdHM6dGhpcy5HZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLlNlLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnBhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuWmQsSE9NQURfQkxPQ0tFRDp0aGlzLllkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsCnRlc3RUYWdzWEhSOnRoaXMuVWMsdGVzdDNQQ29va2llOnRoaXMub2MsdGhyb3R0bGU6dGhpcy5PZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLmljLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudmcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5zYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuaGQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuVmMsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuU2QsY29uZmlnRmFpbHVyZXM6dGhpcy5aYSxzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5yZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLnpmLHZtYXBzOnRoaXMuTmYsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHluOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy4kYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLmpiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuWmI9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5mZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkdnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuU2U9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuSmM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5wYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9CmIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLlpkPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuWWQ9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMudmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5XYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMub2M9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLk9kPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmljPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLnZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuaGQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmCih0aGlzLlZjPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuU2Q9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLlphPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5yZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuemY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmCih0aGlzLk5mPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuemM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmllPWIuYWRGYWxsYmFja1VSTCl9LFZsOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09dHlwZW9mIHRoaXMuWmFbYV0mJjE9PXRoaXMuWmFbYV0mJihiPSEwKTtyZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYil7dGhpcy5aYVtiXT0hMH0sRGw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxNZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9ZS5GayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fAp0aGlzLlpifHx0aGlzLmZkKSYmKGg9dGhpcy5IbShoKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkZsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sUWU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKTGM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuZ2EmJnRoaXMuZ2EubGVuZ3RoJiYwPHRoaXMuZ2EubGVuZ3RoJiYoYT10aGlzLmdhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFJlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuUWUoYik7cmV0dXJuIGF9LEZsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwOwpyZXR1cm4ibm9uZSJ9LHdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2FbdGhpcy5yZl19LFBjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy53ZCgpLGE9dGhpcy5UaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSx4aDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxHbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPApoLmxlbmd0aDtGKyspe3ZhciBrPWhbRl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy54aChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZiloLnB1c2gobCsiPSIrZltsXSk7Zj1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMueGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxIbTpmdW5jdGlvbihiKXt0aGlzLiRiJiYoYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5HbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sUms6ZnVuY3Rpb24oKXt0aGlzLnlhJiYKdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLk1rKHRoaXMueWEuY2xpZW50QVBJcyl9LE1rOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmYS5IbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuR24oYi5wbGF5ZXIpO2EuZigpfX0saTpmdW5jdGlvbihiLGEsZCxmLGMsZSl7bT10aGlzO3RoaXMuU2U9ITA7dGhpcy5KYz1iO3RoaXMucGE9YTt0aGlzLm5mPWQ7dGhpcy5VZD1mO3RoaXMuRGM9Yzt0aGlzLnlhPWV8fHt9O3RoaXMuUmsoKTt0aGlzLnhtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnBhKXRoaXMudm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSwKcmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LHhtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLkpjK3RoaXMub2UoImdsb2JhbCIpKSx0aGlzLlNsLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnRmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuQWMoKX0uYmluZCh0aGlzKSwhMCl9LHZtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLnBhK3RoaXMub2UoImNsaWVudCIsLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoKIj8iKSsoImNhY2hlPSIrdGhpcy5MYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGRhOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhkKXt0aGlzLmhkPSEwO3ZhciBhPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChnKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpOwpmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkRjPSExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWWQpKTsKdGhpcy5UYigpO2UuRmMoay5UbSk7KGE9ZS5DYih0aGlzLndkKCkpKXx8KGE9ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sU2w6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9aWYoIWEuZW5hYmxlZHx8IWEuZm9yY2VfZGlzYWJsZWQpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSwKdGhpcy5UYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnBhfWVsc2UgZD10aGlzLnBhO2lmKCEoZC5lbmFibGVkJiZkLnNlcnZlciYmZC5hbGlhcyYmZC5jb25maWcpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5nYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLkYoIndlYi5kZSIpfHxlLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8CmUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLkxjKCkpZm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5PYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuSmU9ZC5hZHBhdGh8fCIiO3RoaXMucmY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5UYigpKX0sTWM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEEodGhpcy5QYygpKSxkPXRoaXMudGEodGhpcy5PYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEEodGhpcy5PYit0aGlzLm9lKCJjdXN0b21lciIpKTt0aGlzLklhKGEsdGhpcy5hby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY3VzdG9tZXIiKTtiP3RoaXMuVGo/dGhpcy5kYSgibm9TVk1Db25maWciKToodGhpcy5Uaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGFvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuaWM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuVmM9dGhpcy5mYihkLnN0cmljdCk7dGhpcy5TZD10aGlzLmZiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkZnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy4kYT10aGlzLmZiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUGI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5SYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLlVjPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy5vYz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy4kYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlpiPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5mZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT0KZC5qc3BvcHVwc3x8ITE7dGhpcy50Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5WYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuVmI7dGhpcy56Zj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmpkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5OZj1kLnZtYXBzfHwiIjt0aGlzLnpjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmllPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLk9kPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuaWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmljPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMucG8oKSYmKHRoaXMuUGJ8fHRoaXMuUmJ8fHRoaXMuUWJ8fHRoaXMuVWMpP3RoaXMubmY/KHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuVGIoKSk6CnRoaXMuZm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GZigpKX19LGZvOmZ1bmN0aW9uKCl7dGhpcy5lbygpO3RoaXMuaG8oKX0saG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksCkY9ZS5YKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihGLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoRikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwplLnpiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUucWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxGZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuVGIoKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGIpKSx0aGlzLlRiKCksdGhpcy50ZSgpKX0sZW86ZnVuY3Rpb24oKXtpZih0aGlzLlBiKXt2YXIgYj1lLnFkKCk7aWYoKGIuaXNDaHJvbWV8fGIuaXNGaXJlZm94KSYmdGhpcy5tbSgpKXRoaXMuTmQodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUGIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5QYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwpiPWR9Y2F0Y2goZil7fWI/dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5jaSgpfX1lbHNlIHRoaXMuY2koKX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy5rbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuWmguYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWZ1bmN0aW9uIGEoKXt0aGlzLk5kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5RYj10aGlzLlVjKSYmdGhpcy5RYi5sZW5ndGgpe3ZhciBkPXRoaXMuUWIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5aaCgpfSxrbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IEEoYiksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLmJpLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBhKCl7dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlJiJiZ0aGlzLlJiLmxlbmd0aCl7dmFyIGQ9dGhpcy5SYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmJpKCl9LGxvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwKITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihhLGQpe2Q9PWImJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sWmg6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLnlkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMuZmIoYi5jYyk7dGhpcy5GZigpfS5iaW5kKHRoaXMpLHRoaXMuJGguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy4kaCgpfWVsc2UgdGhpcy5GZigpfSwKJGg6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKTt0aGlzLlRiKCk7dGhpcy50ZSgpfSxtbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChiKXtyZXR1cm4iZmFpbCJ9fSxUYjpmdW5jdGlvbigpe3ZhciBiPSIwIixhPSIwIjt0cnl7ZS5TYSgpJiYoYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQWIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlpkKSk7dGhpcy5VZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVkJiZ0aGlzLlVkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkFifSl9LApRazpmdW5jdGlvbigpe2lmKHRoaXMuU2QmJnRoaXMuVmwoKSl7dmFyIGI9dGhpcy5EbCgpO2ImJmIuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYi5qb2luKCJfIiksITApfX0sZ2k6ZnVuY3Rpb24oYil7Ynx8KGI9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGIpdHJ5e2I9Yi50b1N0cmluZygpfWNhdGNoKGEpe2I9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9Yj1iLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITApfSxJYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy52ZHx8KHRoaXMudmQ9MCk7dGhpcy52ZCsrO3RoaXMudmQ+dGhpcy5laCYmIXRoaXMuZmgmJih0aGlzLmZoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5laCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi51aT0hMCk7YyYmZS5rbSgpJiYoYi5QZz0hMCk7aCYmKGIuWWg9ITApO3JldHVybiBiLmxvYWQoKX0sTms6ZnVuY3Rpb24oKXtlLlNhKCl8fAplLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmRhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMudGEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5kYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sY286ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuTmZ9LE9rOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKITApO3ZhciBiPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2IuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYix0aGlzLkVvLmJpbmQodGhpcyksdGhpcy5Eby5iaW5kKHRoaXMpKX0sRW86ZnVuY3Rpb24oYil7dmFyIGE9bnVsbCxkPW51bGw7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLm1sKCl9LERvOmZ1bmN0aW9uKCl7fSxtbDpmdW5jdGlvbigpe2UuRmMoay5sbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sCnRlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMudGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy50Yi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLnRiW2JdOyJyZXF1ZXN0Ij09YS50eXBlJiZlLmFiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09YS50eXBlKXt2YXIgZD1uZXcgSDt3aW5kb3dbZC5mYSgpXT10aGlzO2UuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKGIpe2lmKGIucmVzcG9uc2VUZXh0KXRyeXtldmFsKGIucmVzcG9uc2VUZXh0KX1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0scG86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5PZH0sTGI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0KIiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9LHpiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsYyxlLGgsayxsPTA7bDxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQobCsrKSxmPWIuY2hhckNvZGVBdChsKyspLGM9Yi5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxoPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBhfSx0YTpmdW5jdGlvbihhKXt2YXIgZz0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtnW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZ1sxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSxUaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBnKGEpe3ZhciBiPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9YT4+PjQqZCYxNSxiKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspaFtjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWhbY109ZChoW2MtM11eaFtjLThdXmhbYy0xNF1eaFtjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditoW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditoW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGcoaykrZyhsKStnKG0pK2cocikrZyh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLG09bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuYXA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLmFwfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmJiPWEuYy5SKCk6dGhpcy5iYj0iIjthLmMubWgmJmEuYy5taCh7cGF1c2U6dGhpcy5CZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlFoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmFmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMud28uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5rYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmVjPXRoaXMuZ2Q9ITE7dGhpcy5Daz0xRTM7dGhpcy5yYT1udWxsO3RoaXMuQj1nO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLktkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLkdrPWUuWCgxMCk7CnRoaXMuQmY9MDt0aGlzLmRkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZGQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZGQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQWs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5lZj10aGlzLkpkPSExO3RoaXMudmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLm5lPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5qYz0hMTt0aGlzLiRrPWUuWCgxMCk7dGhpcy5LYj1lLlgoMTApO3RoaXMuSWI9ZS5YKDEwKTt0aGlzLlVoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuVmQ9CnRoaXMuVWI9dGhpcy52ZT10aGlzLm5kPXRoaXMuTGQ9dGhpcy51Yj10aGlzLnFjPXRoaXMuRGg9dGhpcy5zZD10aGlzLnFvPXRoaXMueGI9dGhpcy5KYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5SbT0yMDA7dGhpcy5RZj10aGlzLldjPXRoaXMucmU9dGhpcy5QZj10aGlzLm1mPSExO3RoaXMuY2Y9e319Yy5haj1hO2EucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBnfSxoaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5HYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuVW4oKTtlLm8oay5yayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXZTpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLnhiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkIuUyl0aGlzLkJmKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5CLlFrKCksYz1tLmdldENvbmZpZygpLGUueGUmJih0aGlzLkIueW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQi5IYSYmdGhpcy5CLmlzRW5hYmxlZD8odGhpcy5oaSgpLG5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQi5WYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLmhpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5CLlZiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBrPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2suV2UoYSxnLGQpfSw1MCl9fSxoZjpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuVmQ9dGhpcy5VYj10aGlzLnNkPSExO3RoaXMuYj1hO3RoaXMuTm4odGhpcy5iKTt0aGlzLmFoKGEpO3RoaXMudmM9dGhpcy5SZyhhKTt0aGlzLlZrKCl9LGFoOmZ1bmN0aW9uKGIpe2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mCmEmJih0aGlzLktkPXRoaXMuT2woYikpLHRoaXMuYWgoYi5wYXJlbnQpKX0sUmc6ZnVuY3Rpb24oYil7dmFyIGM9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoYz10aGlzLlJnKGIucGFyZW50KSksYy5wdXNoKHRoaXMueGwoYikpKTtyZXR1cm4gY30seGw6ZnVuY3Rpb24oYSl7dmFyIGM9IiIsZD1bXTtpZihhJiZhLkomJmEuSi5nZXRBdHRyaWJ1dGUpe2M9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylkLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpjLGNyZWF0aXZlSUQ6ZH19LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5KKXtjPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpOwpmPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKylkLnB1c2goYS5sYihjW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmh9fSxxYTpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGM9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJgooYz1hLmVycm9yLmRldGFpbC5jb2RlKSxhLnBkJiZhLnBkLmVycm9yJiZhLnBkLmVycm9yLmNvZGUmJihjPWEucGQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5ZYy5jb2RlOmM9PUQuY2UuY29kZT9lLm8oay5abyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOihlLlhlKCksYz09RC5VZi5jb2RlJiZlLm8oay5MbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKTtlLm8oay5rbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVm4oKTt0aGlzLlVhKCJlbXB0eSIpO3RoaXMuQi5BYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkFiLCEwKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Gbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LlZmLmNvZGU6ZS5vKGsuJG8sCnRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUubyhrLk1tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUubyhrLkJvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUubyhrLkNvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuVWEoInVua25vd24iKX10aGlzLmZjKGEpO3RoaXMuUGEoKX0sZmM6ZnVuY3Rpb24oYSl7dmFyIGM9CjkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihjPWEuZXJyb3IuY29kZSw5MDE8YyYmKGM9OTAwKSk7Zm9yKGM9eyJbRVJST1JDT0RFXSI6Y307YS5NYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk1hLnBvcCgpO3RoaXMuVmUoZC51cmwsZC50eXBlLGMpfWNhdGNoKGYpe319LE5uOmZ1bmN0aW9uKGEpe3RoaXMudmU9ITE7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dmFyIGM9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYz10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuZ2IuekluZGV4PWM7Yz10aGlzLmEuQTt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksZj0iIjtkJiZkLmVudnZhcnMmJihmPWQuZW52dmFycygpKTtmLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLmdldEVudmlyb25tZW50VmFyaWFibGVzJiYoZj1kLmdldEVudmlyb25tZW50VmFyaWFibGVzKCkpOwpmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5tZj0hMCl9Y2F0Y2goaCl7fWMuY3E9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGMuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihjLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZjLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLkFrJiZ0aGlzLnBsYXllci5DZSgpJiYoYy52b2x1bWU9dGhpcy5wbGF5ZXIuQ2UoKS8xMDApO2Zvcig7Yy5maXJzdENoaWxkOyljLnJlbW92ZUNoaWxkKGMuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPAphLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy52ayhjLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMubWYmJmMubG9hZCgpO2lmKHRoaXMuZGkoYykpe3RoaXMuVmgoInNldHVwIix0aGlzLldhKCkpO3RoaXMueWsoYyk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLm1mP3RoaXMudmlkZW89Yzp0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyl9Y2F0Y2gobCl7dGhpcy52aWRlbz1jfX1lbHNlIHRoaXMuYi5XaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChjKSx0aGlzLkxuKCkpOnRoaXMuYi5vcmlnaW4uSGcody4kZCl9LExuOmZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnViPXRoaXMucWM9ITE7dGhpcy5hLmMuc2EmJnRoaXMuYS5jLnNhKCkmJihlLm8oay55Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudWI9ITApO2UudWUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4ubWEmJmUuemsodGhpcy5iLm9yaWdpbi5tYSk7dGhpcy5WaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS5FaCgpO3RoaXMuYS55ZigpO2ZvcihhPQp0aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5hLnlmKCk7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy5yYT10aGlzLmEuSTt0aGlzLm5pKCJ2cGFpZCIpO2lmKHRoaXMudWIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5OYigibXV0ZWQiLCJjb250ZW50Iik7ZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX10aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsCiJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5hLkkuYXBwZW5kQ2hpbGQodGhpcy5DKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUueGYodGhpcy5DLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5DLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLlJsKCksYz10aGlzLmIudS5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsCiJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLm1nKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5CKTt0aGlzLkMuc3JjPWE7ZS5wZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEuaGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ObyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLk9vKCksdGhpcy5hLmhjKCEwKSwhdGhpcy5VYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy5DLApjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmhjKCEwKSx0aGlzLlNvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5XbygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhvKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlRvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5kYyk7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goYyl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLmxlLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuUG8oKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5XYyYmKHRoaXMuUWY9ITEsdGhpcy5uYygpKSx0aGlzLlFvKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLk5iKCJtdXRlZCIsInVzZXIiKSxlLm8oay56ZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSGYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLnBlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe2UuaWEodGhpcy5DLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sUG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLmplLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnFjPSEwfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmJkLHRoaXMuYi51LAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMucWM9ITF9LFNvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sUm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sT286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5XaCgpO2UubyhrLmJnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2UubyhrLmJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuc2Q9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLlpmLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5WYSgibWlkcG9pbnQiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsuaGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLktmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sc2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5DJiZ0aGlzLkMucGFyZW50Tm9kZSYmdGhpcy5DLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGM9dGhpcy5DLnBhcmVudE5vZGU7dGhpcy5DLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DKTtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyk7CmUudWUoKTt0aGlzLkM9ITE7dGhpcy5QYShhKX19LE5vOmZ1bmN0aW9uKGEpe3ZhciBjPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWMmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGM9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGMubWF0Y2goZCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLm8oay5Zbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuc2koITApfSx2azpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkhhJiZiLmlzRW5hYmxlZCYmIWIuTGMoKSl7dmFyIGM9Yi50YShhKTtyZXR1cm4gYy5wcm90b2NvbCsiOi8vIitjLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9ZChjLHRoaXMuQik7Zi5vbmVycm9yPXRoaXMuS28uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoYyx0aGlzLkIpKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LHlrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm9pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMub2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5NZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sb2k6ZnVuY3Rpb24oYSl7dGhpcy5lY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjfHx0aGlzLk1mKGEpfS5iaW5kKHRoaXMpLHRoaXMuQ2spKX0sTWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2QmJnRoaXMuZGkodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5lYyl7dGhpcy5nZD0hMDt0cnl7aWYoIWUuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRmQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5XYSgpLCEwKSx0aGlzLkIuRmd8fHRoaXMuQi5kYSgidmlkZW8tbm9vcCIpKTt0aGlzLlBhKCk7cmV0dXJufX1jYXRjaChjKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5XYSgpLCEwKX10aGlzLkhvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEueWYoKTt0aGlzLkdvKCk7dGhpcy5uaSgpO3RoaXMubmcoKTt0aGlzLmEuRWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuQ2YoKX19LENmOmZ1bmN0aW9uKCl7dGhpcy5uZHx8dGhpcy4kZigpfSwkZjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZpZGVvLnBsYXkoKTtpZihjJiZjWyJjYXRjaCJdKWNbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLm5kfHwoYT90aGlzLlBhKCk6KHRoaXMuYWYoITApLHRoaXMuJGYoITApKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYy5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfS5iaW5kKHRoaXMpO3RoaXMuRWUoKS5TaCh0aGlzKX0sS2Y6ZnVuY3Rpb24oKXt0aGlzLkIuJGEmJiF0aGlzLkpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5vKGsucGssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlBhKCl9LHNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkPSExLGY9MDtmPGEubGVuZ3RoO2YrKylkPWUuV2coYVtmXSksYy5wdXNoKGQpO2E9e2hhc2hlczpjfTthPWsuUmEoYSx0aGlzLnMoKSk7ZS5TbihhKX0sUGE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuV2QmJnRoaXMuc2sodGhpcy5iLldkKTsKaWYoIXRoaXMudmUpaWYodGhpcy52ZT0hMCx0aGlzLlZkfHwoZS5vKGsuT20sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmIud2J8fHRoaXMuYi50Yyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5CZisrO3RoaXMuZWM9dGhpcy5nZD0hMTt0cnl7dGhpcy5GZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMucmEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSmQ9ITE7dHJ5e3RoaXMuYS5saSgpfWNhdGNoKGgpe310aGlzLkxkPSEwO3RoaXMuYS5JZSgpO3RoaXMuamM9ITE7dGhpcy5FZSgpLk9oKCk7dGhpcy5iLndiJiZ0aGlzLmIub3JpZ2luLmJmKCk7dGhpcy5iLnRjJiYoYT90aGlzLmIub3JpZ2luLnloKCk6dGhpcy53ZSgpKX1lbHNlIHRoaXMud2UoKX0sCktvOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRmQodGhpcy52aWRlbyksdGhpcy5MZihhKSl9LExmOmZ1bmN0aW9uKGEpe3RoaXMuZWM9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5CLk5rKCk7dGhpcy5iLm9yaWdpbi5IZyh3LiRkKX0scGk6ZnVuY3Rpb24oKXtpZih0aGlzLnFvKXRoaXMuUGEoKTtlbHNle3RoaXMuamM9ITA7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMudW8oYSk7aWYoIXRoaXMuVWIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpjLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9ZD0iIjt0aGlzLmIuQWYmJihjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVWgpKSYmKGQ9dGhpcy5iLkFmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5KZHx8KHRoaXMuSmQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLmIud2I/KHRoaXMuZWM9dGhpcy5nZD0hMSx0aGlzLkZkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSmQ9ITEsdGhpcy5hLmxpKCksdGhpcy5iLm9yaWdpbi5iZigpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLm5lPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saWk6ZnVuY3Rpb24oKXt0aGlzLkRofHwodGhpcy5EaD0hMCx0aGlzLnNkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sdW86ZnVuY3Rpb24oYSl7ZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthPT10aGlzLmppfHx0aGlzLkpifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fAp0aGlzLldoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkIuJGEmJnRoaXMuVmEoInN0YXJ0IiksZS5vKGsuYmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSxlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnNkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS5vKGsuWmYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUubyhrLmhnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLHRoaXMuamk9YSl9LFZoOmZ1bmN0aW9uKGEsYyl7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGMsITApfSxVbjpmdW5jdGlvbigpe2UuUWQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sV2g6ZnVuY3Rpb24oKXtlLlFkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFZuOmZ1bmN0aW9uKCl7ZS5RZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlFkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFZhOmZ1bmN0aW9uKGEpeyh0aGlzLlBmfHx0aGlzLkIuJGEpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5XYSgpLCEwKX0sTmI6ZnVuY3Rpb24oYSxjKXt0aGlzLkIuJGEmJmUudHJhY2soInN0YXRzX2hkXyIrYSxjLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxjKXtpZighdGhpcy5KYil7dGhpcy5jZiYmdGhpcy5jZi50cmFjayYmdGhpcy5jZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmUueGUmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPQohMH12YXIgZD1bXTt0cnl7ZD10aGlzLlBsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMucmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5LZC5pbXByZXNzaW9ucyYmZS5pbShoLnVybCx0aGlzLktkLmltcHJlc3Npb25zKT90aGlzLlZlKGgudXJsLGgudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLm8oay5xayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCkse2FkSWQ6dGhpcy5LZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5zKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuVmUoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWMpdHJ5e3RoaXMuYi5NYT10aGlzLmNsKHRoaXMuYi5NYSxhKX1jYXRjaChtKXt9fX0sV2E6ZnVuY3Rpb24oKXt2YXIgYT1lLlNhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLApjPSIiO3RoaXMuUGYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFZlOmZ1bmN0aW9uKGEsYyxkLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGM9dGhpcy5CLnZhKGEpLGQmJmMudWsoZCksZnx8KGY9dGhpcy5FZyksZXx8KGU9dGhpcy5FZyksdGhpcy53ayhhKSx0aGlzLkIuSWEoYyxmdW5jdGlvbigpe3RoaXMuTmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sd2s6ZnVuY3Rpb24oYSl7dGhpcy5sY1thXT0ib3BlbiJ9LE5oOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09ImNsb3NlZCJ9LFZrOmZ1bmN0aW9uKCl7dGhpcy5sYz17fX0sWG46ZnVuY3Rpb24oKXt2YXIgYT0wLGM7Zm9yKGMgaW4gdGhpcy5sYyl0aGlzLmxjLmhhc093blByb3BlcnR5KGMpJiYib3BlbiI9PXRoaXMubGNbY10mJmErKztyZXR1cm4gYX0sUGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09CmN9KX0sY2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWN9KX0sSG86ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLklvLmJpbmQodGhpcykpfSxJbzpmdW5jdGlvbigpe2UuU2EoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMubmMoKTp0aGlzLmIuZGMmJihlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt0cnl7dmFyIGM9d2luZG93Lm9wZW4oIiIsYSk7Yy5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZj0KdGhpcy5iLmRjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5kYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LEdvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0KImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5CLmpkJiYoYz10aGlzLkIuamQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGIuYmluZCh0aGlzKSwxRTMqYyk7dGhpcy5jYXB0aW9uPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSl9fSxEYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxIZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oYSl7aWYoIWUuRGYodGhpcy5jb250cm9scykpe3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy4kazt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5LYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5laS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGguc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixoLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuSWI7aC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9oLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnNvLmJpbmQodGhpcykpOmguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucm8uYmluZCh0aGlzKSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSGQoKX0uYmluZCh0aGlzKSk7CmguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuQWYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuU2EoKXx8KHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkhkKCl9LmJpbmQodGhpcykpLHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChkKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsCmMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMueGEmJih0aGlzLnhhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApjLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsueWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLmFmKCkpO3RoaXMuRWIoKX19LEViOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbmM6ZnVuY3Rpb24oKXsiaGlkZGVuIj09dGhpcy5jb250cm9scy5zdHlsZS52aXNpYmlsaXR5fHx0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuUWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkPwoodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSl9LGZpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5xYz8oZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMucWM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZHx8KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWQmJih0aGlzLmEuQS5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsCiEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0scm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZD8odGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5OYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy51Yj8oZS5pYSh0aGlzLkMsCiJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJtdXRlIiksdGhpcy51Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxhZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkfHwodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHdvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQmJih0aGlzLmEuQS5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksdGhpcy5OYigidW5tdXRlZCIsImNvbnRlbnQiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sbWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMpO3RoaXMubmR8fHRoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMucm0oKSYmdGhpcy5xbSgpJiYodGhpcy5CLnNjfHwic3BpZWdlbC5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYicHJlcm9sbCI9PWUuR2ImJnRoaXMudm8oKXx8KHRoaXMubmQ9ITAsdGhpcy54YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54YiksdGhpcy54Yj0hMSksdGhpcy56ZygpKX0scm06ZnVuY3Rpb24oKXt2YXIgYT0KZS5xZCgpO3JldHVybiB0aGlzLkIuVmImJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0scW06ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciIT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5lZnx8KGE9ITAsYy5hZEZhbGxiYWNrVVJMfHwoYy5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3JldHVybihhfHwhdGhpcy5yZSYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuZWZ9LEVsOmZ1bmN0aW9uKCl7dmFyIGE9bS5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpO3JldHVybiBhfSx2bzpmdW5jdGlvbigpe20uZ2V0Q29uZmlnKCk7CnRoaXMuZWY9dGhpcy5XYz10aGlzLlFmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLldhKCksITApO3RoaXMucmU9ITA7dmFyIGE9dGhpcy5FbCgpLGE9ZS5tZyhhLHRoaXMuQiwhMSx7b25seVVSTDohMH0pO2lmKCFhKXJldHVybiExO3RoaXMuV2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtyZXR1cm4hMH0semc6ZnVuY3Rpb24oYSl7dGhpcy5YbigpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemcoITApfS5iaW5kKHRoaXMpLHRoaXMuUm0pOih0aGlzLkxkPSEwLHRoaXMuYS5JZSgpLHRoaXMuYS51bigpLHRoaXMuamM9ITEsZS5vKGsuWmssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLkVlKCkuT2goKSl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYSgibWluVmlzIik7CmEmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5RaCgpOnRoaXMuQmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5kYyxhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi53Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnZjJiYwPHRoaXMudmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnZjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLkdrKyItIit0aGlzLkJmO3RoaXMuYiYmdGhpcy5iLlhnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPQp0aGlzLmIuWGcoKSk7cmV0dXJuIGF9LEVnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5hanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5DbXx8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5sYT1udWxsO3RoaXMuVj1bXTt0aGlzLko9bnVsbDt0aGlzLnVjPXRoaXMud2M9ITE7dGhpcy5tYT0iIjt0aGlzLk9mPSExO3RoaXMuaGg9IiI7ZCYmZC5lbXB0eT90aGlzLkFtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfQp2YXIgYj0wLGcsZD1bXTtjLmFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnFkKCksYjtiPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOm0udmEobS5NZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGUuRigibWFydGhhc3Rld2FydC5jb20iKXx8ZS5GKCJmYW5kb20uY29tIil8fGUuRigiZ2lnYS5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCkpe3ZhciBoPWUuQmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPT09CmguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihkKCl8fGcoKXx8aygpfHwiYXBwc3BvdCI9PWMpbCgpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uTWQoaCkpKyImdHlwZT1qcyIsYj1tLnZhKG0uTWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGUudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPW0udmEobS5NZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy56bS5iaW5kKHRoaXMpLHRoaXMud20uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLmxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5HYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuR2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkdifHx0aGlzLm9tKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLmNvKCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7CnZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09Zy5maXJzdENoaWxkO2MucHVzaChnKX1jYXRjaChoKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9tOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sCmM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sem06ZnVuY3Rpb24oYSl7dGhpcy5jbihhKTt0cnl7dGhpcy5sYT1hLnJlc3BvbnNlWE1MLHRoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj0KdGhpcy5TZygpO3RoaXMud2M9dGhpcy5FZigpO3RoaXMudWM9dGhpcy5haSgpO3RoaXMuaGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLk9jKCk7ZWxzZXt0aGlzLnFhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5PZj9ELmNlOkQuVGZ9KSk7dHJ5e2UudHJhY2soInN0YXRzX2hkX210eXVybCIsZS5DYih0aGlzLm1hKSwhMCl9Y2F0Y2goYyl7fX19LEFtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj10aGlzLlNnKCk7dGhpcy53Yz10aGlzLkVmKCk7dGhpcy51Yz10aGlzLmFpKCk7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuT2Y/RC5jZTpELlRmfSkpfSx3bTpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5RYSh3LlNmLHtkZXB0aDpifSkpfSwKT2M6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy5zbSgpP3RoaXMubW8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5iaCgpLGcse0FkU3lzdGVtOnRoaXMud2woKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlFhKHcuVmYpKTooYj0wLHRoaXMuem8oKSYmdGhpcy5oZih0aGlzLmJsKCkpKX0sYmY6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LmJmKCl9LHloOmZ1bmN0aW9uKCl7dGhpcy51Yz8odGhpcy51Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC55aCgpfSx6bzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpvKCk/dGhpcy5pbygpPyEwOigtMSE9dGhpcy5HYygpP3RoaXMucWEodGhpcy5RYSh3LlhkKSk6dGhpcy5xYSh0aGlzLlFhKHcuUmYpKSwhMSk6KHRoaXMucWEodGhpcy5RYSh3LlljLApELlVmKSksITEpfSxoZjpmdW5jdGlvbihhKXt0aGlzLm1hfHwodGhpcy5tYT0iIik7YS5XZHx8KGEuV2Q9W10pO2EuV2QucHVzaCh0aGlzLmhoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuWWUoKSk7YS53Yj1hLndiP2Eud2I6dGhpcy53YzthLnRjPWEudGM/YS50Yzp0aGlzLnVjO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZzt0aGlzLnBhcmVudC5oZihhKX0sYmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgUmE7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuZHVyYXRpb249dGhpcy5HYygpO2EuTT10aGlzLlpnKCk7YS5kYz10aGlzLnpsKCk7YS5rcT1bXTthLm9yaWdpbj10aGlzO2EudT10aGlzLnZsKCk7YS5BZj10aGlzLk5sKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8Cih0aGlzLm1hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuT2c7aWYoIXRoaXMuSiYmdGhpcy5sYSYmdGhpcy5sYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLmxhO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGM9ITE7KGM9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmYy5sZW5ndGgmJmUudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuTWE9YS5lcnJvci5jb2RlIT13LlhkLmNvZGU/YS5NYS5jb25jYXQodGhpcy5BbCgpKTphLk1hLmNvbmNhdCh0aGlzLkpsKCkpKTt0aGlzLlYubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYyYmdGhpcy5wYXJlbnQuZmMoYSksYj0wLHRoaXMuT2MoKSk6Cih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5xYSYmdGhpcy5wYXJlbnQucWEoYSksYj0wKX0sZmM6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZmMoYSl9LEhnOmZ1bmN0aW9uKGEsYil7dGhpcy5xYSh0aGlzLlFhKGEsYikpfSxRYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBTYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIGI8Z30sam86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlpnKCkubGVuZ3RofSxpbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuR2MoKX0sRWY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlYuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxhaTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuViYmMjw9dGhpcy5WLmxlbmd0aCYmCiF0aGlzLkVmKCkmJihhPSEwKTtyZXR1cm4gYX0sY246ZnVuY3Rpb24oYSl7dGhpcy5tYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm1hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubWE9IlVOS05PV04ifXRyeXt0aGlzLk9mPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSx3bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sWWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMub2goYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLm9oKGEucGFyZW50Tm9kZSk6ITF9LEpsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEFsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx6bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxPYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksRXA6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuT2F8fDFFMzt0cnl7dmFyIGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksYj1nLmNvbmNhdChlKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMudWQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sTmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5SbihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LERlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sR2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMudWQoYSk6IiJ9LHVkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLkdlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ha3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmxqfHxUYTtuZXcgVGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk1hPVtdO3RoaXMuTT1bXTt0aGlzLmRjPSIiO3RoaXMudT10aGlzLnRjPXRoaXMud2I9ITE7dGhpcy5LZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuTGU9IiJ9Yy5Kaj1hO2EucHJvdG90eXBlPXtXazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxIbDpmdW5jdGlvbigpe2lmKCF0aGlzLktlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubGEpe3ZhciBhPXRoaXMub3JpZ2luLmxhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGM9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1jLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLktlPWFbZF0pfXJldHVybiB0aGlzLktlfSxYZzpmdW5jdGlvbigpe2lmKHRoaXMuTGUpcmV0dXJuIHRoaXMuTGU7dmFyIGE9IiI7KGE9dGhpcy5IbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuTGU9YX0sUmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bY107cmV0dXJuIGF9fX0pKGMpO3ZhciBSYT1jLkpqfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkxpfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e2VlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLExhOiJYTUxfUEFSU0VfRVJST1IifSxSZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTGE6IkRVUkFUSU9OX0VSUk9SIn0sWWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLExhOiJFTVBUWV9WQVNUIn0sVmY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkxhOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxTZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixMYToiTE9BRF9FUlJPUiJ9LCRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixMYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LAplcDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixMYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTGE6IkRVTU1ZX0FEIn19LEQ9e1RmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTGE6Ik5PX0FEUyJ9LFVmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixMYToiTk9fTUVESUFGSUxFUyJ9LGZwOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLExhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sY2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlvPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFZhPWMueW98fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5lcnJvcj1hO3RoaXMucGQ9Yzt0aGlzLk1hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFNhPWMuT2l8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMuTml8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5QaD1hO3RoaXMudmlkZW89Yzt0aGlzLlRkPVtdO3RoaXMuTWg9W107dGhpcy5kZj1bXTt0aGlzLkpvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSygpfWMuZ3A9YTthLnByb3RvdHlwZT17SzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5QaC5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLlBoW2FdLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suWnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmhuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5UZC5wdXNoKHtzcmM6ZCxmcmFtZTpoLFNtOmUsdmVuZG9yOmMuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7Yzx0aGlzLmRmLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuZGZbY107ZC50eXBlPT09YSYmZC5Jayh0aGlzLkJsKGEpKX19LApCbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpcTohMCxocTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntWcDoidmlkZW8iLGxxOiJqc0N1c3RvbSIsbXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxucToxLEZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sClFsOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5UZC5sZW5ndGg7YysrKWlmKHRoaXMuVGRbY10udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5UZFtjXS5TbTtyZXR1cm4iIn0scm46ZnVuY3Rpb24oYSxjKXt0aGlzLk1oLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlFsKGMpLHZlbmRvcjpjfSk7dGhpcy5UbigpfSxobjpmdW5jdGlvbihhLGMpeyJ2aWRlbyI9PT1hP3RoaXMuSm8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMua2coYSxjKX0uYmluZCh0aGlzKSk6dGhpcy5rZyhhLGMpfSxrZzpmdW5jdGlvbihhLGMpe3RoaXMuZGYucHVzaCh7dHlwZTphLElrOmMsZnE6ITF9KX0sVG46ZnVuY3Rpb24oKXt0aGlzLk1oLm1hcChmdW5jdGlvbihhKXthLmxtfHwoYS5ZcCh7YWRTZXNzaW9uSWQ6ZS5YKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5qcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmxtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMudG18fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMua2I9YS5UZygpO3RoaXMuST1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkkuaWQ9ZS5YKDEwKTt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5OYT17fTt0aGlzLmxnPSExOwp0aGlzLmFjPVtdfWMuS2k9YTthLnByb3RvdHlwZT17dWw6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxlPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGU9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6ZSx5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy51bChhKTtmb3IodmFyIGM9MCxkPTAsZT0hMSxoPXRoaXMuWmwoYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMH0sbGk6ZnVuY3Rpb24oKXt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEVoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5jLmwoKSl9LHVuOmZ1bmN0aW9uKCl7dGhpcy5sZ3x8Cih0aGlzLmMucGxheSgpLGUubyhrLm1kLHRoaXMuYy5sKCkpKX0seWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSS5zdHlsZS56SW5kZXg9YTt0aGlzLkkuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5JLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkkuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkkuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTsKdGhpcy5jLlJjJiZ0aGlzLmMuUmMoKT90aGlzLmMuVGcoKS5hcHBlbmRDaGlsZCh0aGlzLkkpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5JKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxabDpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gZH0sc2w6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTtjLnBvc2l0aW9uP2MucG9zaXRpb249Yy5wb3NpdGlvbjpjLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy53aWR0aD1hLm9mZnNldFdpZHRoO2MuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gY30saGM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zbCh0aGlzLmtiKTtpZihjLnghPXRoaXMuTmEueHx8Yy55IT10aGlzLk5hLnl8fGMucG9zaXRpb24hPXRoaXMuTmEucG9zaXRpb258fGMud2lkdGghPXRoaXMuTmEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLk5hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk5hLndpZHRoJiYwPHRoaXMuTmEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5JZSgpO3JldHVybn10aGlzLk5hPWM7dGhpcy5jLlJjKCk/KHRoaXMuSS5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSS5zdHlsZS50b3A9IjBweCIpOih0aGlzLkkuc3R5bGUubGVmdD1jLngrInB4Iix0aGlzLkkuc3R5bGUudG9wPWMueSsicHgiKTt0aGlzLkkuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9Yy5oZWlnaHQrInB4Ijt0aGlzLkkuc3R5bGUucG9zaXRpb249Yy5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuYWMubGVuZ3RoO2ErKyl0aGlzLmFjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWUuRGYodGhpcy5JKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5hY3x8KHRoaXMuYWM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmFjLnB1c2goYSl9LEllOmZ1bmN0aW9uKCl7dGhpcy5JJiZ0aGlzLkkucGFyZW50Tm9kZSYmdGhpcy5JLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSSk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuS2l8fFlhLEI9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPQplLlgoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgJGE9Yy5UaXx8JGE7bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5HZChhKTt0aGlzLkNnKCl9LEdkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYWI9Yy5Eanx8YWI7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWNhKCk7dGhpcy5ZYj10aGlzLllifHwhMTt0aGlzLmNnPXRoaXMuZWc9CnRoaXMubGg9dGhpcy51YT10aGlzLkdmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLkdmPSEwO3RoaXMubGgmJnRoaXMudWcoKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmpjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMua2QoKTt0aGlzLmxoPSEwO3RoaXMudWcoKX0uYmluZCh0aGlzKSk7CnRoaXMucGcoKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5ZYil7dGhpcy5rZCgpO2lmKCF0aGlzLkdmJiYhdGhpcy5rZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuR2YmJnRoaXMuY2cmJiF0aGlzLmVnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LCRnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGIubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1iLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YSlyZXR1cm4gZC5pbnN0YW5jZX19LHBnOmZ1bmN0aW9uKCl7aWYodGhpcy5rZCgpKXt2YXIgYT0KdGhpcy4kZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLmVnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuY2c9YS5DcH10aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLlRwKCk6ITF9LEdjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5HYygpOi0xfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxxbDpmdW5jdGlvbihhLGIpe3RoaXMuWWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuWWJ8fDMwMj09dGhpcy5ZYj90aGlzLnVhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5ZYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksMTAwKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE/KHRoaXMudygpLHRoaXMub2EoKSk6YS5NZSgpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLktsKGEpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuQ2p8fGJiOyhmdW5jdGlvbihjKXtjLkVqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbm06ZnVuY3Rpb24oKXt3aW5kb3cuT08uTmoubmsubGs/d2luZG93Lk9PLk5qLm5rLmxrLkFwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWNhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkZlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBhYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgYmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIGNiPWMuRWp8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMub289YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBlYj1jLm9vfHxlYjtuZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLkhoKCl9LEhoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5VJiYoMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcyksMTAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0scmc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmcoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMucmcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5yZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuRWl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sS2g6ZnVuY3Rpb24oYSl7YT1uZXcgZmIoYSk7YS5qYT90aGlzLlAoKTp0aGlzLkwoYSl8fChhLkdkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk4oYSksKG5ldyBnYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLnJsfHwodGhpcy5ybD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuS2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLktoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGhiPWMuR2l8fGhiLFM9bmV3IGhiKHIpO1MuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGliPWMuaGx8fGliO25ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFQ9Yy5Xanx8VDsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LmNkKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguY2QoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5QbShhKX0uYmluZCh0aGlzKSk7eC5jZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKTt4LmNkKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5VbCgpfSxQbTpmdW5jdGlvbihhKXt2YXIgYj0iIixjO2ZvcihjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7Yj1pc05hTihhW2NdKT8hMTphW2NdO2lmKDEwMDk9PWFbY118fDEwMDE9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKXt0aGlzLncoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2NdKWlmKGFbY10uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbY11bZF0pPyExOmFbY11bZF0sMTAwOT09YVtjXVtkXXx8CjEwMDE9PWFbY11bZF18fDMwMz09YVtjXVtkXXx8NDAzPT1hW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkQoKX19KX0pKGMpO3ZhciBVPWMuVmp8fFU7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO3RoaXMuQWQmJihhPWUuZGwoYSx0aGlzLkFkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFQoZCk7aWYoIXRoaXMuTChkKSl7dGhpcy5OKGQpOwp2YXIgZj1uZXcgVShkLHRoaXMuRyk7Zi5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuQWR8fCh0aGlzLkFkPVtdKSx0aGlzLkFkLnB1c2goYVtiXSksZD1uZXcgVChoKSx0aGlzLkwoZCl8fCh0aGlzLk4oZCksZj1uZXcgVShkLHRoaXMuRyksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxjZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGMpfSxubzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLk5jfHwKKHRoaXMuTmM9W10pLHRoaXMuTmMucHVzaChhKSx0aGlzLnRuKCkmJih0aGlzLnBmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bY10mJjA8dGhpcy5hYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmFhW2JdW2NdLmxlbmd0aDtkKyspdGhpcy5hYVtiXVtjXVtkXShhKX19LFVsOmZ1bmN0aW9uKCl7aWYodGhpcy5OYylmb3IodmFyIGE9MDthPHRoaXMuTmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5OY1thXSxjPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbY11bZF0mJjA8dGhpcy5hYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmFhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5hYVtjXVtkXVtlXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4Lm5vKGEpfX0pfSkoYyk7dmFyIGpiPWMuWGp8fGpiLHg9bmV3IGpiKHIpO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2I9Yy5ibnx8a2I7bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sd2E6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBsYj1jLkJpfHxsYjsoZnVuY3Rpb24oYyl7Yy5DaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkQoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbWI9Yy5DaXx8Cm1iOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbGIoZCk7dGhpcy5MKGgpfHwodGhpcy5OKGgpLChuZXcgbWIoaCx0aGlzLkcpKS5mKCkpfWNhdGNoKGspe319dGhpcy5QKCl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihiPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYj1jLk1pfHxwYjtuZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLndnPXRoaXMuRWM9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dmFyIGI9dGhpcy5KZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuRWM9Yik7aWYoIXRoaXMud2cmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fAphLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixhLnNvdXJjZS5DSE9PU0VSX0FCfHwiIiwhMCk7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixjLCEwKTt0aGlzLndnPSEwfX19Y2F0Y2goaCl7fX0uYmluZCh0aGlzKSk7dGhpcy5WZygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuZ24odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSxWZzpmdW5jdGlvbigpe2lmKHRoaXMuRWMpcmV0dXJuIHRoaXMuRWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuSmcoYSkpcmV0dXJuIHRoaXMuRWM9CmF9fSxKZzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiZhLnZpZGVvU2xvdCYmKGI9YSk7YSYmYS5oZHZwYWlkJiYoYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZ246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiYKdGhpcy5lYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5tdXRlJiZ0aGlzLmVhLm11dGUoKX0uYmluZCh0aGlzKSk7YSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sbWg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy55anx8cWI7KGZ1bmN0aW9uKGMpe2MueGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLnRpJiYodGhpcy5nKCksdGhpcy50aT0hMCx0aGlzLmthKCkpOwpiLkdhKCkuYWRkRXZlbnRMaXN0ZW5lcihhLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuVmcoKT90aGlzLkQoKToodGhpcy55ZXx8KHRoaXMueWU9MSksdGhpcy55ZSsrLDEwMDx0aGlzLnllP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy54anx8cmI7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLkwoYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTsKdmFyIHNiPWMuemp8fHNiLFY9bmV3IHNiKHIpO1YuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5RbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRiPWMuUW18fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5VPygwLHRoaXMuVSkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZmt8fHViOyhmdW5jdGlvbihjKXtjLmVrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEljOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSwKYT1hLmdldFJhd1BsYXllcigpO3JldHVybiBhLmltYUFkc0xvYWRlcn0sZW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMub2EoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMuZ2V0UGxheWVyKCk7CnRoaXMuQmE/dGhpcy5lbih0aGlzLkJhKToodGhpcy5CYT10aGlzLkljKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuRCgpO3JldHVybn1pZighdGhpcy54Yyl7dGhpcy5EKCk7cmV0dXJufWE9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmViLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmViW2JdJiYzMDMhPXRoaXMuZWJbYl0mJjQwMyE9dGhpcy5lYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMub2EoKTtlbHNle3RoaXMuRCgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZWt8fHZiOyhmdW5jdGlvbihjKXtjLmdrPQp0LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlRhPS0xO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5MKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuZ2t8fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmJtfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuamY9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLldtKCl9LmJpbmQodGhpcyksNTAwKX0sV206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5VJiZ0aGlzLlUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksCmI9MDthLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYj1hLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuamYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuamYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXbjpmdW5jdGlvbigpe3RoaXMuamY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLlJqfHwKemI7KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnBjPTB9LGY6ZnVuY3Rpb24oKXt0aGlzLkVtPTEwO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5wY3x8KHRoaXMucGM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5nKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5wY3x8dGhpcy5wYysrLHRoaXMucGM8PXRoaXMuRW0/KHRoaXMucGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5XbigpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5Ranx8QWI7KGZ1bmN0aW9uKGMpe2MuU2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSwKdGhpcy5HKSkuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgQmI9Yy5Tanx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIERiPWMueG98fERiO25ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0iIjthLmN1cnJlbnRUaW1lJiYoYj1hLmN1cnJlbnRUaW1lKTtyZXR1cm4gYn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sS2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5VKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuUGp8fEViOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5HYSgpLGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZztiJiZiLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7YS5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5CYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMudW0oKTp0aGlzLnRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5nKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LFhrOmZ1bmN0aW9uKCl7dGhpcy5hZygpfHx0aGlzLmcoITApfSx1bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQmIoKTshYS5uYSYmYS5WJiZhLnpwJiZhLkJwJiYodGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZygpKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7YS5hZHNMb2FkZXI/YS5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2gpZm9yKHZhciBhPQpjLlpjLkJiKCksYj10aGlzLmdldFBsYXllcigpLkdhKCkuaWQsZT0wO2U8YS5sZW5ndGg7ZSsrKWFbZV0uaWQ9PWImJih0aGlzLkNoPWFbZV0pO3JldHVybiB0aGlzLkNofSxVcDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxnOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2E/dGhpcy5CYigpLmFkc0xvYWRlcj90aGlzLkQoITApOnRoaXMuRCgpOnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLk9qfHxGYjsoZnVuY3Rpb24oYyl7Yy5aYz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBrOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgRmIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Yy5aYy5CYigpO2lmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuUGsoYVtiXSk7dGhpcy5QKCl9fSk7Yy5aYy5CYj1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKGwmJmwucGxheWVyYXBpJiYoYT1sLnBsYXllcmFwaSgpKSYmYS5sZW5ndGgpcmV0dXJuIGE7dmFyIGE9W10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSwKYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCksYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kKTtpZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5aY3x8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuJGl8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnVqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RSYmKGE9YS5maXJzdENoaWxkKTtpZihhKXt0aGlzLlQoYSk7aWYoYS50YWdOYW1lKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1iP3RoaXMuVyhiKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxTcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYzpmdW5jdGlvbigpe3JldHVybiEwfSxHYTpmdW5jdGlvbigpe3ZhciBhO0U/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9CmMudWp8fFc7KGZ1bmN0aW9uKGMpe2MudGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMua2Y9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5rZj1hLmlkKTtFP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLmtmJiZjIT10aGlzLmtmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuJHApLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy50anx8WDsoZnVuY3Rpb24oYyl7Yy52aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRSlmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBXKGEpLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBYKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmphP3RoaXMucGYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEUsSmI9Yy52anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLlVtfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5ZaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLApjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlooKSk6dGhpcy5aKCk6dGhpcy5aKCk6dGhpcy5aKCl9LHduOmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxYcDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBNYj1jLllpfHxNYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5xZygpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMua2EoKX0uYmluZCh0aGlzKSl9LHFnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLkdldEFkRXJyb3JzQ2FjaGUoKSxjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5oYW5kbGVFcnJvcihiW2NdKTthLkNsZWFyQWRFcnJvcnNDYWNoZSgpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT0KYSl0aGlzLnFnKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuZygpKX19LGc6ZnVuY3Rpb24oYSl7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIE5iPWMuWGl8fE5iOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7YXx8KGE9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYSYmYS5HZXRBbGxQbGF5ZXJzJiYoYT1hLkdldEFsbFBsYXllcnMoKSkmJjA8YS5sZW5ndGgpZm9yKHZhciBiPQowO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTWIoYVtiXSk7Yy5qYXx8dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgTmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIE9iPWMuWml8fE9iLFBiPW5ldyBPYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYj1jLkltfHxRYjtuZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTsKYnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWigpfSxSZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sZm46ZnVuY3Rpb24oKXt0aGlzLlhjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWGN8fCh0aGlzLlhjPSEwLHRoaXMuUmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlhjJiYodGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlhjPSExKSx0aGlzLlJkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgUmI9Yy5qa3x8UmI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sTGg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxoLmJpbmQodGhpcyksMTApfSxiYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMub2s9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuZygpKToodGhpcy5va3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuZygpKX0sWWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuYmMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLllmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuTGgoKTt0aGlzLllmKCk7dGhpcy5qbigpfSxqbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmRuP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLmRuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuYmMoYSkpfX0pfSkoYyk7dmFyIFNiPWMuaWt8fFNiOyhmdW5jdGlvbihjKXtjLmtrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEuZm4oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgVGI9Yy5ra3x8VGIsVWI9bmV3IFRiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLmpsfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLkZoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLkptPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX1lbHNlIHRoaXMuWigpfSx3bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KbX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUGQoYSl9LmJpbmQodGhpcykpfSxQZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5GaCYmKHRoaXMuRmg9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLlpqfHxOOyhmdW5jdGlvbihjKXtjLllqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5CZSlpZih0aGlzLkhifHwKKHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuSm4oKTp0aGlzLmcoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuZygpOnRoaXMuZyghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkJlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuY2EoYSk7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5Zanx8TzsoZnVuY3Rpb24oYyl7Yy4kaj0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVGE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5wZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFdiPWMuJGp8fFdiLFhiPW5ldyBXYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYj1jLkVrfHxZYjtuZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnFqfHxZOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmloPTA7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmVkPSExO3RoaXMuSmg9ZS5MYigxMCk7dGhpcy5xaCgpfSxxaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnNiKCksITA7dGhpcy5paCsrO2lmKDEwPHRoaXMuaWgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuZyghMCk6dGhpcy5nKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5xaC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLnVhPQohMH0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgWj1jLnBqfHxaOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWSh3aW5kb3cucGxheWVyKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLnJqfHxaYiwkYj1uZXcgWmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy4kbHx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5WaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2coKX0sc2c6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBjYz1jLlVpfHwKY2M7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmphKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYz1jLldpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmM9Yy5Va3x8ZmM7bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLndpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy53aXx8Z2M7KGZ1bmN0aW9uKGMpe2Mudmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpO3RoaXMuc2UoKTt0aGlzLm9nKCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LENhOmZ1bmN0aW9uKCl7dGhpcy51YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sb2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5vYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9nLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuc2UuYmluZCh0aGlzKSwxMDApfSxzZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMudml8fGhjOyhmdW5jdGlvbihjKXtjLnhpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT0KbmV3IGdjKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgaGMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuUmEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlJhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMueGl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLm5sfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMucmg9dGhpcy50aD10aGlzLnNoPSExO3RoaXMuQ2Q9W107dGhpcy5vZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHphP251bGw6emEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgUz9udWxsOlMsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFViP251bGw6VWIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Maj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLkxsKGEpOltdLGM7dGhpcy50aD0hMDtpZihhLmxlbmd0aCl7dGhpcy5zaD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sCnRoaXMuUmgoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLm9mKXtpZih0aGlzLnJoKWJyZWFrO2M9dGhpcy5vZltkXTt0aGlzLkpmKGMpJiYodGhpcy5DZC5wdXNoKGMpLHRoaXMuUmgoYykpfX0sSmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxMbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZD1hW2VdLGQ9dGhpcy5vZltkXSx0aGlzLkpmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LFJoOmZ1bmN0aW9uKGEpe3RoaXMuSmYoYSkmJmEuZigpfSxZbjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuc2gpZm9yKHRoaXMucmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uU2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5TYil9fX0pKGMpO3ZhciBsYz1jLkxqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5nbHx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRmMoay5BbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsCmMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTt2YXIgRz1uZXcgSCxsPSExO0cuZmEoKTtHLm5oKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5mYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcubmgoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LAohMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuTmcod2luZG93LEcuZG0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5TaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy54ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTt0aGlzLkVkPTA7dGhpcy5JaD0hMTt0aGlzLmxmPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnlpPWE7YS5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3RoaXMuR2g9YX0sdmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmJiPXRoaXMucGxheWVyLlIoKX0sCmdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQW46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx6bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTsKdmFyIGQ9ITEsZj0hMTtpZih0aGlzLmVtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5wYSx0aGlzLm5iLm5mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMudm4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuJG4oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsaCk7bC54bih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuRG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5TaChsKX19LGVtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy54ZC5nZXRUaW1lKCksdGhpcy54ZD1hLDNFNTxjPyEwOiExO3RoaXMueGQ9YTtyZXR1cm4hMX0sUW46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS51ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLklnKGEpKT90aGlzLlNjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksCjApLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfSxQbjpmdW5jdGlvbihhKXtpZighdGhpcy5HaCl7ZS51ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuRm4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSWcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsubWQsdGhpcy5wbGF5ZXIubCgpKSl9fSxJZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sbW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Nbih0aGlzLlBuLmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5LYSgpfSxJZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS51ZigibWlkcm9sbCIpO2lmKCF0aGlzLndoKXt0aGlzLndoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfX0sbG46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Fbih0aGlzLklkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlplKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlFuKCk7dGhpcy5wbGF5ZXIuWmUmJnRoaXMubG4oKTt0aGlzLm1uKCl9LG5uOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkRkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5jcChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRWQ9dGhpcy5EZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkVkJiYoYT0hMCk7cmV0dXJuIGF9LHZuOmZ1bmN0aW9uKGEpe3RoaXMuSWg9YTtmb3IoYT0wO2E8dGhpcy5EZC5sZW5ndGg7YSsrKXRoaXMuRGRbYV1bImZ1bmN0aW9uIl0odGhpcy4kbS5iaW5kKHRoaXMpKX0sJG06ZnVuY3Rpb24oYSl7dGhpcy5FZC0tO2EmJnRoaXMubGYucHVzaChhKTswPj10aGlzLkVkJiZ0aGlzLkloKCl9LERtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLmxmLmxlbmd0aDtkKyspYz0KdGhpcy5sZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy55aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnBsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoZWVCaWNoYWhNaWFNZWVHaCxlZUJpY2hhaE1pYU1lZUdoKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
144.76.115.236
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.236.115.76.144.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- b1ae253cba132ab2566227a6f5a59ea9a90cdffef6f6bf06c55a222ed3afef53
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.giga.de/
Frame 34FB
|
24 B
409 B
|
11ms
1ms
|
XHR
application/octet-stream |
144.76.115.236
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,dmFyIGVlQmljaGFoTWlhTWVlR2g9ZWVCaWNoYWhNaWFNZWVHaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZmZ8fCh4LmZmPTApO3guZmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5mZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5IayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2IudmYoYyk7Yi5BbihtKTtiLnpuKGwpO2Iubm4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Jbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS51aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5pbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGs9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlptLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5naD17fTt0aGlzLnNmPSExfWMuY2o9YTthLnByb3RvdHlwZT17Wm46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnNmfHwodGhpcy5zZj1lLlgoMTApKTtyZXR1cm4gdGhpcy5zZn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmdoW2JdJiYodGhpcy5naFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlpuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx6azpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sWm06ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuWW0oYi5kYXRhKX0sWW06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxCZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5XZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMueWQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxXZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx4azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnRsKGIpKXJldHVybjsoYT10aGlzLkJnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx0bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFVnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxLbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHhmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuYWwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuS24oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sSms6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGFsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5KayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxEZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxwaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFRoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGttOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scWQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAphbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxGajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxoazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQWkoKXx8Yi5IaSgpfHxiLmFtKCl8fGIuRmooKXx8Yi5oaygpfHxiLnNqKCl8fGIuVWooKX19O3JldHVybiBudWxsIT1iLkRrKCl9LHlsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxkbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxSbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxRZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMua2koYSkrIjoiK3RoaXMua2koTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGtpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx1ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE5nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxhbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk1sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sU246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLnZhKGIsITApO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS52YShmLCEwKTtmPW0udmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFFkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uT2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnVkKGIpOiIifSx1ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG1nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5wbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnFmJiZ3aW5kb3cuc2FuZGJveC5xZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLkxnKGIpKXJldHVybiB0aGlzLkxnKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS53ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy54ayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHlkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5bTpmdW5jdGlvbihiLGEsZCl7dGhpcy55ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx1aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMueW0oZi53ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGNwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxGazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0saW06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmJqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWm89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5rbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmJwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuZ2c9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuWmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5kZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5oZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EucGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuYmc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Gbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS4kbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLlprPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5tZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5mZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eucms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5iZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnFrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5yaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuemQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS55Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuWW89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQm89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Bbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLmZsfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxJbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnRkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudGQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG5oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5JbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnRkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmRqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuSWk9YX0pKGMpO3ZhciBLPWMuSWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Ca3x8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Laj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5CbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scGY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sR2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudGgmJkwuWW4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxqbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLktqfHx0OyhmdW5jdGlvbihjKXtjLk1qPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5EZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTW46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRW46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sR2Q6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnRrKCk7dGhpcy5HZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHRrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxTaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LE9oOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkRnfHwodGhpcy5EZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLk1qfHxxOyhmdW5jdGlvbihjKXtjLnppPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuV2Y9IjEiO3RoaXMuWGY9IjIiO3RoaXMubWs9IjMiO3RoaXMuJGM9MDt0aGlzLkZtPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5pZz10aGlzLm1pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMudmYoYSk7dGhpcy5DbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm1pfHwodGhpcy5taT0hMCxlLlhlKCkpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGNtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0sZ206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMud2YoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmNtKCk7aWYoIXRoaXMuZ20oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMud2YoKTtyZXR1cm59dGhpcy53ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuZ2koKTt0aGlzLmlnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy56YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGdpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldmfSx3ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWGZ9LEpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ta30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxhZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5XZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWGZ9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx2ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxHbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEJtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy56aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Canx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLnRvfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuS2coKTt0aGlzLk1nKCk7dGhpcy5Zaz0hMX0sS2c6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5JZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSWQoYil9LmJpbmQodGhpcykpfSxJZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5uanx8cmE7KGZ1bmN0aW9uKGMpe2MubWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5rZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgZz0wO2c8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7ZysrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbZ10udGFnKXt0aGlzLnliPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueWI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMueWI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0KImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPGQubGVuZ3RoO2crKylhLm9uKGRbZ10sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtnXSYmKHRoaXMuaGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtnXSYmdGhpcy5BaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkZtJiYhdGhpcy56YSgpJiYodGhpcy55Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLApmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLllrPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5CZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmFkLmluZGV4T2YoYikmJnRoaXMuYWQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmFkLmxlbmd0aD49dGhpcy5rZSYmdGhpcy5nKCkpfSwKQm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRGYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmhlfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuS2coKSxiLk1nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLm1qfHxzYTsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT0KdGhpcy5DbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKWEucHVzaChiW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpO3RoaXMuTChnKXx8dGhpcy5qbShnKXx8KHRoaXMuTihnKSxnPW5ldyBzYShnLHRoaXMuRyksZy5LKCksZy5mKCkpfX10aGlzLlAoKX19LEpwOmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LENsOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihhLmFuY2hvcil9fSl9KShjKTt2YXIgdGE9Yy5vanx8dGEsdWE9bmV3IHRhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuYm98fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmNrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEpe3ZhciBiPWEuZWxfO2J8fChiPWEuZWwoKSk7Yj8odGhpcy5UKGIpLChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYSl7dGhpcy5QZChhKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFiWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuYXV0b3BsYXk/YS5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHdhPWMuY2t8fHdhOyhmdW5jdGlvbihjKXtjLmJrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5LYz10aGlzLkJhPXRoaXMuZWQ9ITE7dGhpcy5KaD1lLkxiKDEwKTt0aGlzLklmPSEwO3RoaXMueGM9dGhpcy5raD0hMTt0aGlzLkttKGEuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy56aCgpLHRoaXMuS2soKSx0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGEuViwiOyIsdHlwZW9mIGEuViwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYS5WP2EuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGEuVj90eXBlb2YgYS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYS5pbWEsIjsiLHR5cGVvZiBhLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGEuSCwiOyIsdHlwZW9mIGEuSCwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLmltYT9hLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5pbWEmJmEuaW1hLkVhP2EuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IixhLmltYSYmYS5pbWEuRWE/dHlwZW9mIGEuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5mZToKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixhLkg/YS5ILmZlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILmdlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZ2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/CnR5cGVvZiBhLkgubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5xZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuSmgpfSxIYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5pbWEzJiYodGhpcy5pbWE9YS5pbWEzKTtpZihhLmltYSl7dGhpcy5pbWE9YS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LEljOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmEpe3ZhciBhPXRoaXMuSGMoKTthJiYoYS5hZHNMb2FkZXImJih0aGlzLm5hPWEuYWRzTG9hZGVyKSxhLl9hZHNMb2FkZXImJih0aGlzLm5hPWEuX2Fkc0xvYWRlciksYS5nZXRBZHNMb2FkZXImJih0aGlzLm5hPWEuZ2V0QWRzTG9hZGVyKSxhLmNvbnRyb2xsZXImJmEuY29udHJvbGxlci5zZGtJbXBsJiZhLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm5hPWEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm5hfSxZZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGhtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuamgpe3ZhciBhPQp0aGlzLkhjKCksYj10aGlzLmZtKCk7d2luZG93LmltYSYmYSYmKGEuX2Fkc0xvYWRlcnx8YS5hZHNMb2FkZXJ8fGIpJiYodGhpcy5qaD0hMCl9cmV0dXJuIHRoaXMuamh9LGZtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5lZCYmYS5hZHMmJihhLmFkcy5zdGF0ZXx8YS5hZHMuX3N0YXRlKSYmKHRoaXMuZWQ9ITApO3JldHVybiB0aGlzLmVkfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWMoKTtpZihhKXt2YXIgYj0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rbigpfS5iaW5kKHRoaXMpKSwKYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxrbjpmdW5jdGlvbigpe3RoaXMueGM9ITA7dmFyIGE9dGhpcy5ZZygpO2lmKGF8fHRoaXMuemEoKSl7dmFyIGI9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5jYShiKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuU2EoKSYmKGQ9Ik1fIik7YS5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDsKaWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYi5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnljfHwodGhpcy5tKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5iYSgpLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LElwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5BZyYmYS5hZHMmJih0aGlzLkFnPWEuYWRzKTtyZXR1cm4gdGhpcy5BZ30sS2s6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7CnRoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLkFoKCl9LmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YSYmKChhPXRoaXMuWWcoKSkmJmEuZGVzdHJveT9hLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoKX0uYmluZCh0aGlzKSw1MCkpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcoKSYmMDxhLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5obSgpKXt2YXIgYj10aGlzLkhjKCksZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLncoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5raD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8KKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMua2g9ITA7YS5pc1BsYXlpbmcoKSYmMTA8YS5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDUwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sTGs6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpOwpyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGsoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIGUueGU/ITE6dGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXtpZih0aGlzLllsKCkpe3RoaXMudWE9ITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXRoaXMuSWY9ITEsZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsInNldCIsITApO3RoaXMuZyghMCl9ZWxzZSB0aGlzLnVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpfSxZbDpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPQohMTtlLnlkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2E9IWUuZmIoYi5jYyl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthPSExfSwhMCwhMCk7dmFyIGI9ZS55bCgpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUueGU9LTEhPWIuaW5kZXhPZigiZmlyZWZveCIpfHwtMSE9Yi5pbmRleE9mKCJzYWZhcmkiKXx8YX1yZXR1cm4hMX0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy56YSgpfHwoYXx8KHRoaXMuSWY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSWYsZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApUazpmdW5jdGlvbigpe3RoaXMuUnB8fCgxMDx0aGlzLkxvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuTG8rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5zbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxzbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Nbyl7dGhpcy5Nbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmEudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5kaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuWGgod2luZG93KTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl0cnl7Yj1ifHx0aGlzLlhoKGFbZ10pfWNhdGNoKGQpe310aGlzLlAoKX19LFhoOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTt2YXIgeWE9Yy5ka3x8eWEsemE9bmV3IHlhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Baj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEFhPWMuQWp8fEFhO25ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuZ2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTsKcmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5XKGEpOnRoaXMuWigpfSxWbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZiLGc9dGhpcy5oYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5qYyYmKDA8PWcuaW5kZXhPZihkKXx8Yi5CZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuZ2Y9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKd2E6ZnVuY3Rpb24oKXt0aGlzLmdmKys7aWYoMTA8dGhpcy5nZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgphJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7dmFyIEJhPWMuSGp8fEJhOyhmdW5jdGlvbihjKXtjLkdqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5IYisrLDE1PHRoaXMuSGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPQohMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpOwp2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm9sPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5vbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlZtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Hanx8Q2E7KGZ1bmN0aW9uKGMpe2MuSWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBCYShhW2JdKTtnLmphfHx0aGlzLkwoZyl8fCh0aGlzLk4oZyksKG5ldyBDYShnLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Janx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuVGx8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlVnKGEsImVsZW1lbnRJRCIpOwpzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLlhtPWEucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1hLndpZHRoO2cuc3R5bGUubWluV2lkdGg9YS53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5YbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5yZD1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMucmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnJkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sU2s6ZnVuY3Rpb24oKXtlLnBoKHRoaXMucmQpO2UuT2UodGhpcy5yZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5qanx8R2E7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaWp8fEhhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiYKbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5VZyhhLCJlbGVtZW50SUQiKTtpZihlLnBoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmtqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy53anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPQoiR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxEbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHVrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixnLGQsZil7dGhpcy5YYT1iO3RoaXMuUGc9dGhpcy51aT0hMTt0aGlzLkJoPWQ7dGhpcy5ZaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmCjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJm0mJm0uUmUodGhpcy5YYS51cmwpJiZtLlZjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5EbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiKwpkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlBnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0aGlzLmhiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5ZaD90aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy51aXx8KHRoaXMuaGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwKInJlcXVlc3RfZmFpbGVkIiwhMCk6bS5SZSh0aGlzLlhhLnVybCksdGhpcy5CaCYmdGhpcy5CaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9Yy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkRhPXRoaXMuYmU9ITF9Yy5KaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihiKXt0aGlzLmJlPWJ9LEduOmZ1bmN0aW9uKGIpe3RoaXMuRGE9Yn0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIiwicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIiwKdnA6IkFkU2tpcHBlZCIsd3A6IkFkU3RhcnRlZCIsbHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixtcDoiQWRJbXByZXNzaW9uIixpcDoiQWRDcmVhdGl2ZVZpZXciLHBwOiJBZFZpZGVvTWlkcG9pbnQiLHFwOiJBZFBhdXNlZCIsc3A6IkFkVmlkZW9TdGFydCIsdHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5iZSxhW2RdKX0scG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmFlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmFlKXRoaXMuRGEuYWUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuRGEsdGhpcy5EYS5hZVthXSk7dGhpcy5EYSYmdGhpcy5EYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYS5nZXRFcnJvcigpO2ImJmNvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsImdvdCBlcnJvciIsYil9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5iZSYmdGhpcy5xbigpO3RoaXMuRGEmJnRoaXMucG4oKX19fSkoYyk7dmFyIE1hPWMuSml8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IYT0hMTt0aGlzLiRiPSIiO3RoaXMuZmQ9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5HZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm5mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuWmQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7CnRoaXMuWWQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnZiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLldiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLlBiPSIiO3RoaXMuUWI9W107dGhpcy5SYj1bXTt0aGlzLlVjPVtdO3RoaXMub2M9IiI7dGhpcy5BYj0hMTt0aGlzLk9kPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaWM9ITE7dGhpcy52Zz10aGlzLlVkPW51bGw7dGhpcy56Zj10aGlzLlZiPXRoaXMuRmc9dGhpcy5TZD10aGlzLlZjPXRoaXMuaGQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnZkPTA7dGhpcy5maD0hMTt0aGlzLmVoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy4kYixhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlpiLGFkdGFncmVnZXg6dGhpcy5mZCxiaXRyYXRlOnRoaXMuT2EsanNwb3B1cHM6dGhpcy5UZSxzaWRlbG9hZHM6dGhpcy50YixkaXNhYmxldGVzdHM6dGhpcy5HZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLlNlLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnBhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuWmQsSE9NQURfQkxPQ0tFRDp0aGlzLllkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsCnRlc3RUYWdzWEhSOnRoaXMuVWMsdGVzdDNQQ29va2llOnRoaXMub2MsdGhyb3R0bGU6dGhpcy5PZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLmljLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudmcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5zYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuaGQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuVmMsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuU2QsY29uZmlnRmFpbHVyZXM6dGhpcy5aYSxzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5yZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLnpmLHZtYXBzOnRoaXMuTmYsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHluOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy4kYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLmpiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuWmI9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5mZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkdnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuU2U9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuSmM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5wYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9CmIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLlpkPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuWWQ9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMudmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5XYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMub2M9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLk9kPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmljPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLnZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuaGQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmCih0aGlzLlZjPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuU2Q9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLlphPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5yZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuemY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmCih0aGlzLk5mPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuemM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmllPWIuYWRGYWxsYmFja1VSTCl9LFZsOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09dHlwZW9mIHRoaXMuWmFbYV0mJjE9PXRoaXMuWmFbYV0mJihiPSEwKTtyZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYil7dGhpcy5aYVtiXT0hMH0sRGw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxNZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9ZS5GayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fAp0aGlzLlpifHx0aGlzLmZkKSYmKGg9dGhpcy5IbShoKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkZsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sUWU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKTGM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuZ2EmJnRoaXMuZ2EubGVuZ3RoJiYwPHRoaXMuZ2EubGVuZ3RoJiYoYT10aGlzLmdhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFJlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuUWUoYik7cmV0dXJuIGF9LEZsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwOwpyZXR1cm4ibm9uZSJ9LHdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2FbdGhpcy5yZl19LFBjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy53ZCgpLGE9dGhpcy5UaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSx4aDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxHbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPApoLmxlbmd0aDtGKyspe3ZhciBrPWhbRl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy54aChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZiloLnB1c2gobCsiPSIrZltsXSk7Zj1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMueGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxIbTpmdW5jdGlvbihiKXt0aGlzLiRiJiYoYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5HbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sUms6ZnVuY3Rpb24oKXt0aGlzLnlhJiYKdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLk1rKHRoaXMueWEuY2xpZW50QVBJcyl9LE1rOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmYS5IbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuR24oYi5wbGF5ZXIpO2EuZigpfX0saTpmdW5jdGlvbihiLGEsZCxmLGMsZSl7bT10aGlzO3RoaXMuU2U9ITA7dGhpcy5KYz1iO3RoaXMucGE9YTt0aGlzLm5mPWQ7dGhpcy5VZD1mO3RoaXMuRGM9Yzt0aGlzLnlhPWV8fHt9O3RoaXMuUmsoKTt0aGlzLnhtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnBhKXRoaXMudm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSwKcmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LHhtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLkpjK3RoaXMub2UoImdsb2JhbCIpKSx0aGlzLlNsLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnRmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuQWMoKX0uYmluZCh0aGlzKSwhMCl9LHZtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLnBhK3RoaXMub2UoImNsaWVudCIsLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoKIj8iKSsoImNhY2hlPSIrdGhpcy5MYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGRhOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhkKXt0aGlzLmhkPSEwO3ZhciBhPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChnKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpOwpmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkRjPSExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWWQpKTsKdGhpcy5UYigpO2UuRmMoay5UbSk7KGE9ZS5DYih0aGlzLndkKCkpKXx8KGE9ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sU2w6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9aWYoIWEuZW5hYmxlZHx8IWEuZm9yY2VfZGlzYWJsZWQpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSwKdGhpcy5UYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnBhfWVsc2UgZD10aGlzLnBhO2lmKCEoZC5lbmFibGVkJiZkLnNlcnZlciYmZC5hbGlhcyYmZC5jb25maWcpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5nYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLkYoIndlYi5kZSIpfHxlLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8CmUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLkxjKCkpZm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5PYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuSmU9ZC5hZHBhdGh8fCIiO3RoaXMucmY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5UYigpKX0sTWM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEEodGhpcy5QYygpKSxkPXRoaXMudGEodGhpcy5PYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEEodGhpcy5PYit0aGlzLm9lKCJjdXN0b21lciIpKTt0aGlzLklhKGEsdGhpcy5hby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY3VzdG9tZXIiKTtiP3RoaXMuVGo/dGhpcy5kYSgibm9TVk1Db25maWciKToodGhpcy5Uaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGFvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuaWM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuVmM9dGhpcy5mYihkLnN0cmljdCk7dGhpcy5TZD10aGlzLmZiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkZnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy4kYT10aGlzLmZiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUGI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5SYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLlVjPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy5vYz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy4kYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlpiPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5mZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT0KZC5qc3BvcHVwc3x8ITE7dGhpcy50Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5WYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuVmI7dGhpcy56Zj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmpkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5OZj1kLnZtYXBzfHwiIjt0aGlzLnpjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmllPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLk9kPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuaWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmljPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMucG8oKSYmKHRoaXMuUGJ8fHRoaXMuUmJ8fHRoaXMuUWJ8fHRoaXMuVWMpP3RoaXMubmY/KHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuVGIoKSk6CnRoaXMuZm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GZigpKX19LGZvOmZ1bmN0aW9uKCl7dGhpcy5lbygpO3RoaXMuaG8oKX0saG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksCkY9ZS5YKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihGLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoRikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwplLnpiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUucWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxGZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuVGIoKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGIpKSx0aGlzLlRiKCksdGhpcy50ZSgpKX0sZW86ZnVuY3Rpb24oKXtpZih0aGlzLlBiKXt2YXIgYj1lLnFkKCk7aWYoKGIuaXNDaHJvbWV8fGIuaXNGaXJlZm94KSYmdGhpcy5tbSgpKXRoaXMuTmQodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUGIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5QYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwpiPWR9Y2F0Y2goZil7fWI/dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5jaSgpfX1lbHNlIHRoaXMuY2koKX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy5rbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuWmguYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWZ1bmN0aW9uIGEoKXt0aGlzLk5kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5RYj10aGlzLlVjKSYmdGhpcy5RYi5sZW5ndGgpe3ZhciBkPXRoaXMuUWIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5aaCgpfSxrbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IEEoYiksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLmJpLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBhKCl7dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlJiJiZ0aGlzLlJiLmxlbmd0aCl7dmFyIGQ9dGhpcy5SYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmJpKCl9LGxvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwKITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihhLGQpe2Q9PWImJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sWmg6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLnlkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMuZmIoYi5jYyk7dGhpcy5GZigpfS5iaW5kKHRoaXMpLHRoaXMuJGguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy4kaCgpfWVsc2UgdGhpcy5GZigpfSwKJGg6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKTt0aGlzLlRiKCk7dGhpcy50ZSgpfSxtbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChiKXtyZXR1cm4iZmFpbCJ9fSxUYjpmdW5jdGlvbigpe3ZhciBiPSIwIixhPSIwIjt0cnl7ZS5TYSgpJiYoYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQWIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlpkKSk7dGhpcy5VZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVkJiZ0aGlzLlVkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkFifSl9LApRazpmdW5jdGlvbigpe2lmKHRoaXMuU2QmJnRoaXMuVmwoKSl7dmFyIGI9dGhpcy5EbCgpO2ImJmIuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYi5qb2luKCJfIiksITApfX0sZ2k6ZnVuY3Rpb24oYil7Ynx8KGI9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGIpdHJ5e2I9Yi50b1N0cmluZygpfWNhdGNoKGEpe2I9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9Yj1iLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITApfSxJYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy52ZHx8KHRoaXMudmQ9MCk7dGhpcy52ZCsrO3RoaXMudmQ+dGhpcy5laCYmIXRoaXMuZmgmJih0aGlzLmZoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5laCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi51aT0hMCk7YyYmZS5rbSgpJiYoYi5QZz0hMCk7aCYmKGIuWWg9ITApO3JldHVybiBiLmxvYWQoKX0sTms6ZnVuY3Rpb24oKXtlLlNhKCl8fAplLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmRhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMudGEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5kYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sY286ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuTmZ9LE9rOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKITApO3ZhciBiPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2IuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYix0aGlzLkVvLmJpbmQodGhpcyksdGhpcy5Eby5iaW5kKHRoaXMpKX0sRW86ZnVuY3Rpb24oYil7dmFyIGE9bnVsbCxkPW51bGw7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLm1sKCl9LERvOmZ1bmN0aW9uKCl7fSxtbDpmdW5jdGlvbigpe2UuRmMoay5sbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sCnRlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMudGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy50Yi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLnRiW2JdOyJyZXF1ZXN0Ij09YS50eXBlJiZlLmFiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09YS50eXBlKXt2YXIgZD1uZXcgSDt3aW5kb3dbZC5mYSgpXT10aGlzO2UuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKGIpe2lmKGIucmVzcG9uc2VUZXh0KXRyeXtldmFsKGIucmVzcG9uc2VUZXh0KX1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0scG86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5PZH0sTGI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0KIiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9LHpiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsYyxlLGgsayxsPTA7bDxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQobCsrKSxmPWIuY2hhckNvZGVBdChsKyspLGM9Yi5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxoPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBhfSx0YTpmdW5jdGlvbihhKXt2YXIgZz0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtnW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZ1sxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSxUaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBnKGEpe3ZhciBiPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9YT4+PjQqZCYxNSxiKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspaFtjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWhbY109ZChoW2MtM11eaFtjLThdXmhbYy0xNF1eaFtjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditoW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditoW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGcoaykrZyhsKStnKG0pK2cocikrZyh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLG09bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuYXA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLmFwfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmJiPWEuYy5SKCk6dGhpcy5iYj0iIjthLmMubWgmJmEuYy5taCh7cGF1c2U6dGhpcy5CZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlFoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmFmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMud28uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5rYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmVjPXRoaXMuZ2Q9ITE7dGhpcy5Daz0xRTM7dGhpcy5yYT1udWxsO3RoaXMuQj1nO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLktkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLkdrPWUuWCgxMCk7CnRoaXMuQmY9MDt0aGlzLmRkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZGQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZGQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQWs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5lZj10aGlzLkpkPSExO3RoaXMudmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLm5lPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5qYz0hMTt0aGlzLiRrPWUuWCgxMCk7dGhpcy5LYj1lLlgoMTApO3RoaXMuSWI9ZS5YKDEwKTt0aGlzLlVoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuVmQ9CnRoaXMuVWI9dGhpcy52ZT10aGlzLm5kPXRoaXMuTGQ9dGhpcy51Yj10aGlzLnFjPXRoaXMuRGg9dGhpcy5zZD10aGlzLnFvPXRoaXMueGI9dGhpcy5KYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5SbT0yMDA7dGhpcy5RZj10aGlzLldjPXRoaXMucmU9dGhpcy5QZj10aGlzLm1mPSExO3RoaXMuY2Y9e319Yy5haj1hO2EucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBnfSxoaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5HYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuVW4oKTtlLm8oay5yayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXZTpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLnhiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkIuUyl0aGlzLkJmKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5CLlFrKCksYz1tLmdldENvbmZpZygpLGUueGUmJih0aGlzLkIueW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQi5IYSYmdGhpcy5CLmlzRW5hYmxlZD8odGhpcy5oaSgpLG5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQi5WYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLmhpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5CLlZiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBrPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2suV2UoYSxnLGQpfSw1MCl9fSxoZjpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuVmQ9dGhpcy5VYj10aGlzLnNkPSExO3RoaXMuYj1hO3RoaXMuTm4odGhpcy5iKTt0aGlzLmFoKGEpO3RoaXMudmM9dGhpcy5SZyhhKTt0aGlzLlZrKCl9LGFoOmZ1bmN0aW9uKGIpe2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mCmEmJih0aGlzLktkPXRoaXMuT2woYikpLHRoaXMuYWgoYi5wYXJlbnQpKX0sUmc6ZnVuY3Rpb24oYil7dmFyIGM9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoYz10aGlzLlJnKGIucGFyZW50KSksYy5wdXNoKHRoaXMueGwoYikpKTtyZXR1cm4gY30seGw6ZnVuY3Rpb24oYSl7dmFyIGM9IiIsZD1bXTtpZihhJiZhLkomJmEuSi5nZXRBdHRyaWJ1dGUpe2M9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylkLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpjLGNyZWF0aXZlSUQ6ZH19LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5KKXtjPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpOwpmPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKylkLnB1c2goYS5sYihjW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmh9fSxxYTpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGM9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJgooYz1hLmVycm9yLmRldGFpbC5jb2RlKSxhLnBkJiZhLnBkLmVycm9yJiZhLnBkLmVycm9yLmNvZGUmJihjPWEucGQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5ZYy5jb2RlOmM9PUQuY2UuY29kZT9lLm8oay5abyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOihlLlhlKCksYz09RC5VZi5jb2RlJiZlLm8oay5MbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKTtlLm8oay5rbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVm4oKTt0aGlzLlVhKCJlbXB0eSIpO3RoaXMuQi5BYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkFiLCEwKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Gbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LlZmLmNvZGU6ZS5vKGsuJG8sCnRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUubyhrLk1tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUubyhrLkJvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUubyhrLkNvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuVWEoInVua25vd24iKX10aGlzLmZjKGEpO3RoaXMuUGEoKX0sZmM6ZnVuY3Rpb24oYSl7dmFyIGM9CjkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihjPWEuZXJyb3IuY29kZSw5MDE8YyYmKGM9OTAwKSk7Zm9yKGM9eyJbRVJST1JDT0RFXSI6Y307YS5NYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk1hLnBvcCgpO3RoaXMuVmUoZC51cmwsZC50eXBlLGMpfWNhdGNoKGYpe319LE5uOmZ1bmN0aW9uKGEpe3RoaXMudmU9ITE7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dmFyIGM9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYz10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuZ2IuekluZGV4PWM7Yz10aGlzLmEuQTt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksZj0iIjtkJiZkLmVudnZhcnMmJihmPWQuZW52dmFycygpKTtmLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLmdldEVudmlyb25tZW50VmFyaWFibGVzJiYoZj1kLmdldEVudmlyb25tZW50VmFyaWFibGVzKCkpOwpmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5tZj0hMCl9Y2F0Y2goaCl7fWMuY3E9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGMuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihjLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZjLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLkFrJiZ0aGlzLnBsYXllci5DZSgpJiYoYy52b2x1bWU9dGhpcy5wbGF5ZXIuQ2UoKS8xMDApO2Zvcig7Yy5maXJzdENoaWxkOyljLnJlbW92ZUNoaWxkKGMuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPAphLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy52ayhjLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMubWYmJmMubG9hZCgpO2lmKHRoaXMuZGkoYykpe3RoaXMuVmgoInNldHVwIix0aGlzLldhKCkpO3RoaXMueWsoYyk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLm1mP3RoaXMudmlkZW89Yzp0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyl9Y2F0Y2gobCl7dGhpcy52aWRlbz1jfX1lbHNlIHRoaXMuYi5XaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChjKSx0aGlzLkxuKCkpOnRoaXMuYi5vcmlnaW4uSGcody4kZCl9LExuOmZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnViPXRoaXMucWM9ITE7dGhpcy5hLmMuc2EmJnRoaXMuYS5jLnNhKCkmJihlLm8oay55Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudWI9ITApO2UudWUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4ubWEmJmUuemsodGhpcy5iLm9yaWdpbi5tYSk7dGhpcy5WaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS5FaCgpO3RoaXMuYS55ZigpO2ZvcihhPQp0aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5hLnlmKCk7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy5yYT10aGlzLmEuSTt0aGlzLm5pKCJ2cGFpZCIpO2lmKHRoaXMudWIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5OYigibXV0ZWQiLCJjb250ZW50Iik7ZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX10aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsCiJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5hLkkuYXBwZW5kQ2hpbGQodGhpcy5DKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUueGYodGhpcy5DLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5DLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLlJsKCksYz10aGlzLmIudS5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsCiJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLm1nKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5CKTt0aGlzLkMuc3JjPWE7ZS5wZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEuaGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ObyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLk9vKCksdGhpcy5hLmhjKCEwKSwhdGhpcy5VYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy5DLApjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmhjKCEwKSx0aGlzLlNvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5XbygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhvKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlRvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5kYyk7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goYyl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLmxlLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuUG8oKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5XYyYmKHRoaXMuUWY9ITEsdGhpcy5uYygpKSx0aGlzLlFvKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLk5iKCJtdXRlZCIsInVzZXIiKSxlLm8oay56ZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSGYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLnBlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe2UuaWEodGhpcy5DLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sUG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLmplLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnFjPSEwfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmJkLHRoaXMuYi51LAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMucWM9ITF9LFNvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sUm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sT286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5XaCgpO2UubyhrLmJnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2UubyhrLmJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuc2Q9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLlpmLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5WYSgibWlkcG9pbnQiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsuaGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLktmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sc2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5DJiZ0aGlzLkMucGFyZW50Tm9kZSYmdGhpcy5DLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGM9dGhpcy5DLnBhcmVudE5vZGU7dGhpcy5DLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DKTtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyk7CmUudWUoKTt0aGlzLkM9ITE7dGhpcy5QYShhKX19LE5vOmZ1bmN0aW9uKGEpe3ZhciBjPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWMmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGM9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGMubWF0Y2goZCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLm8oay5Zbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuc2koITApfSx2azpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkhhJiZiLmlzRW5hYmxlZCYmIWIuTGMoKSl7dmFyIGM9Yi50YShhKTtyZXR1cm4gYy5wcm90b2NvbCsiOi8vIitjLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9ZChjLHRoaXMuQik7Zi5vbmVycm9yPXRoaXMuS28uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoYyx0aGlzLkIpKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LHlrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm9pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMub2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5NZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sb2k6ZnVuY3Rpb24oYSl7dGhpcy5lY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjfHx0aGlzLk1mKGEpfS5iaW5kKHRoaXMpLHRoaXMuQ2spKX0sTWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2QmJnRoaXMuZGkodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5lYyl7dGhpcy5nZD0hMDt0cnl7aWYoIWUuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRmQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5XYSgpLCEwKSx0aGlzLkIuRmd8fHRoaXMuQi5kYSgidmlkZW8tbm9vcCIpKTt0aGlzLlBhKCk7cmV0dXJufX1jYXRjaChjKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5XYSgpLCEwKX10aGlzLkhvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEueWYoKTt0aGlzLkdvKCk7dGhpcy5uaSgpO3RoaXMubmcoKTt0aGlzLmEuRWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuQ2YoKX19LENmOmZ1bmN0aW9uKCl7dGhpcy5uZHx8dGhpcy4kZigpfSwkZjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZpZGVvLnBsYXkoKTtpZihjJiZjWyJjYXRjaCJdKWNbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLm5kfHwoYT90aGlzLlBhKCk6KHRoaXMuYWYoITApLHRoaXMuJGYoITApKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYy5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfS5iaW5kKHRoaXMpO3RoaXMuRWUoKS5TaCh0aGlzKX0sS2Y6ZnVuY3Rpb24oKXt0aGlzLkIuJGEmJiF0aGlzLkpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5vKGsucGssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlBhKCl9LHNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkPSExLGY9MDtmPGEubGVuZ3RoO2YrKylkPWUuV2coYVtmXSksYy5wdXNoKGQpO2E9e2hhc2hlczpjfTthPWsuUmEoYSx0aGlzLnMoKSk7ZS5TbihhKX0sUGE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuV2QmJnRoaXMuc2sodGhpcy5iLldkKTsKaWYoIXRoaXMudmUpaWYodGhpcy52ZT0hMCx0aGlzLlZkfHwoZS5vKGsuT20sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmIud2J8fHRoaXMuYi50Yyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5CZisrO3RoaXMuZWM9dGhpcy5nZD0hMTt0cnl7dGhpcy5GZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMucmEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSmQ9ITE7dHJ5e3RoaXMuYS5saSgpfWNhdGNoKGgpe310aGlzLkxkPSEwO3RoaXMuYS5JZSgpO3RoaXMuamM9ITE7dGhpcy5FZSgpLk9oKCk7dGhpcy5iLndiJiZ0aGlzLmIub3JpZ2luLmJmKCk7dGhpcy5iLnRjJiYoYT90aGlzLmIub3JpZ2luLnloKCk6dGhpcy53ZSgpKX1lbHNlIHRoaXMud2UoKX0sCktvOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRmQodGhpcy52aWRlbyksdGhpcy5MZihhKSl9LExmOmZ1bmN0aW9uKGEpe3RoaXMuZWM9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5CLk5rKCk7dGhpcy5iLm9yaWdpbi5IZyh3LiRkKX0scGk6ZnVuY3Rpb24oKXtpZih0aGlzLnFvKXRoaXMuUGEoKTtlbHNle3RoaXMuamM9ITA7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMudW8oYSk7aWYoIXRoaXMuVWIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpjLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9ZD0iIjt0aGlzLmIuQWYmJihjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVWgpKSYmKGQ9dGhpcy5iLkFmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5KZHx8KHRoaXMuSmQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLmIud2I/KHRoaXMuZWM9dGhpcy5nZD0hMSx0aGlzLkZkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSmQ9ITEsdGhpcy5hLmxpKCksdGhpcy5iLm9yaWdpbi5iZigpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLm5lPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saWk6ZnVuY3Rpb24oKXt0aGlzLkRofHwodGhpcy5EaD0hMCx0aGlzLnNkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sdW86ZnVuY3Rpb24oYSl7ZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthPT10aGlzLmppfHx0aGlzLkpifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fAp0aGlzLldoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkIuJGEmJnRoaXMuVmEoInN0YXJ0IiksZS5vKGsuYmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSxlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnNkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS5vKGsuWmYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUubyhrLmhnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLHRoaXMuamk9YSl9LFZoOmZ1bmN0aW9uKGEsYyl7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGMsITApfSxVbjpmdW5jdGlvbigpe2UuUWQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sV2g6ZnVuY3Rpb24oKXtlLlFkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFZuOmZ1bmN0aW9uKCl7ZS5RZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlFkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFZhOmZ1bmN0aW9uKGEpeyh0aGlzLlBmfHx0aGlzLkIuJGEpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5XYSgpLCEwKX0sTmI6ZnVuY3Rpb24oYSxjKXt0aGlzLkIuJGEmJmUudHJhY2soInN0YXRzX2hkXyIrYSxjLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxjKXtpZighdGhpcy5KYil7dGhpcy5jZiYmdGhpcy5jZi50cmFjayYmdGhpcy5jZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmUueGUmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPQohMH12YXIgZD1bXTt0cnl7ZD10aGlzLlBsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMucmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5LZC5pbXByZXNzaW9ucyYmZS5pbShoLnVybCx0aGlzLktkLmltcHJlc3Npb25zKT90aGlzLlZlKGgudXJsLGgudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLm8oay5xayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCkse2FkSWQ6dGhpcy5LZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5zKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuVmUoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWMpdHJ5e3RoaXMuYi5NYT10aGlzLmNsKHRoaXMuYi5NYSxhKX1jYXRjaChtKXt9fX0sV2E6ZnVuY3Rpb24oKXt2YXIgYT1lLlNhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLApjPSIiO3RoaXMuUGYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFZlOmZ1bmN0aW9uKGEsYyxkLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGM9dGhpcy5CLnZhKGEpLGQmJmMudWsoZCksZnx8KGY9dGhpcy5FZyksZXx8KGU9dGhpcy5FZyksdGhpcy53ayhhKSx0aGlzLkIuSWEoYyxmdW5jdGlvbigpe3RoaXMuTmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sd2s6ZnVuY3Rpb24oYSl7dGhpcy5sY1thXT0ib3BlbiJ9LE5oOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09ImNsb3NlZCJ9LFZrOmZ1bmN0aW9uKCl7dGhpcy5sYz17fX0sWG46ZnVuY3Rpb24oKXt2YXIgYT0wLGM7Zm9yKGMgaW4gdGhpcy5sYyl0aGlzLmxjLmhhc093blByb3BlcnR5KGMpJiYib3BlbiI9PXRoaXMubGNbY10mJmErKztyZXR1cm4gYX0sUGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09CmN9KX0sY2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWN9KX0sSG86ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLklvLmJpbmQodGhpcykpfSxJbzpmdW5jdGlvbigpe2UuU2EoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMubmMoKTp0aGlzLmIuZGMmJihlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt0cnl7dmFyIGM9d2luZG93Lm9wZW4oIiIsYSk7Yy5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZj0KdGhpcy5iLmRjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5kYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LEdvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0KImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5CLmpkJiYoYz10aGlzLkIuamQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGIuYmluZCh0aGlzKSwxRTMqYyk7dGhpcy5jYXB0aW9uPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSl9fSxEYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxIZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oYSl7aWYoIWUuRGYodGhpcy5jb250cm9scykpe3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy4kazt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5LYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5laS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGguc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixoLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuSWI7aC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9oLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnNvLmJpbmQodGhpcykpOmguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucm8uYmluZCh0aGlzKSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSGQoKX0uYmluZCh0aGlzKSk7CmguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuQWYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuU2EoKXx8KHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkhkKCl9LmJpbmQodGhpcykpLHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChkKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsCmMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMueGEmJih0aGlzLnhhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApjLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsueWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLmFmKCkpO3RoaXMuRWIoKX19LEViOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbmM6ZnVuY3Rpb24oKXsiaGlkZGVuIj09dGhpcy5jb250cm9scy5zdHlsZS52aXNpYmlsaXR5fHx0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuUWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkPwoodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSl9LGZpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5xYz8oZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMucWM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZHx8KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWQmJih0aGlzLmEuQS5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsCiEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0scm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZD8odGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5OYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy51Yj8oZS5pYSh0aGlzLkMsCiJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJtdXRlIiksdGhpcy51Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxhZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkfHwodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHdvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQmJih0aGlzLmEuQS5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksdGhpcy5OYigidW5tdXRlZCIsImNvbnRlbnQiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sbWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMpO3RoaXMubmR8fHRoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMucm0oKSYmdGhpcy5xbSgpJiYodGhpcy5CLnNjfHwic3BpZWdlbC5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYicHJlcm9sbCI9PWUuR2ImJnRoaXMudm8oKXx8KHRoaXMubmQ9ITAsdGhpcy54YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54YiksdGhpcy54Yj0hMSksdGhpcy56ZygpKX0scm06ZnVuY3Rpb24oKXt2YXIgYT0KZS5xZCgpO3JldHVybiB0aGlzLkIuVmImJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0scW06ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciIT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5lZnx8KGE9ITAsYy5hZEZhbGxiYWNrVVJMfHwoYy5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3JldHVybihhfHwhdGhpcy5yZSYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuZWZ9LEVsOmZ1bmN0aW9uKCl7dmFyIGE9bS5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpO3JldHVybiBhfSx2bzpmdW5jdGlvbigpe20uZ2V0Q29uZmlnKCk7CnRoaXMuZWY9dGhpcy5XYz10aGlzLlFmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLldhKCksITApO3RoaXMucmU9ITA7dmFyIGE9dGhpcy5FbCgpLGE9ZS5tZyhhLHRoaXMuQiwhMSx7b25seVVSTDohMH0pO2lmKCFhKXJldHVybiExO3RoaXMuV2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtyZXR1cm4hMH0semc6ZnVuY3Rpb24oYSl7dGhpcy5YbigpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemcoITApfS5iaW5kKHRoaXMpLHRoaXMuUm0pOih0aGlzLkxkPSEwLHRoaXMuYS5JZSgpLHRoaXMuYS51bigpLHRoaXMuamM9ITEsZS5vKGsuWmssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLkVlKCkuT2goKSl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYSgibWluVmlzIik7CmEmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5RaCgpOnRoaXMuQmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5kYyxhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi53Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnZjJiYwPHRoaXMudmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnZjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLkdrKyItIit0aGlzLkJmO3RoaXMuYiYmdGhpcy5iLlhnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPQp0aGlzLmIuWGcoKSk7cmV0dXJuIGF9LEVnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5hanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5DbXx8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5sYT1udWxsO3RoaXMuVj1bXTt0aGlzLko9bnVsbDt0aGlzLnVjPXRoaXMud2M9ITE7dGhpcy5tYT0iIjt0aGlzLk9mPSExO3RoaXMuaGg9IiI7ZCYmZC5lbXB0eT90aGlzLkFtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfQp2YXIgYj0wLGcsZD1bXTtjLmFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnFkKCksYjtiPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOm0udmEobS5NZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGUuRigibWFydGhhc3Rld2FydC5jb20iKXx8ZS5GKCJmYW5kb20uY29tIil8fGUuRigiZ2lnYS5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCkpe3ZhciBoPWUuQmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPT09CmguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihkKCl8fGcoKXx8aygpfHwiYXBwc3BvdCI9PWMpbCgpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uTWQoaCkpKyImdHlwZT1qcyIsYj1tLnZhKG0uTWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGUudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPW0udmEobS5NZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy56bS5iaW5kKHRoaXMpLHRoaXMud20uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLmxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5HYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuR2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkdifHx0aGlzLm9tKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLmNvKCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7CnZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09Zy5maXJzdENoaWxkO2MucHVzaChnKX1jYXRjaChoKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9tOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sCmM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sem06ZnVuY3Rpb24oYSl7dGhpcy5jbihhKTt0cnl7dGhpcy5sYT1hLnJlc3BvbnNlWE1MLHRoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj0KdGhpcy5TZygpO3RoaXMud2M9dGhpcy5FZigpO3RoaXMudWM9dGhpcy5haSgpO3RoaXMuaGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLk9jKCk7ZWxzZXt0aGlzLnFhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5PZj9ELmNlOkQuVGZ9KSk7dHJ5e2UudHJhY2soInN0YXRzX2hkX210eXVybCIsZS5DYih0aGlzLm1hKSwhMCl9Y2F0Y2goYyl7fX19LEFtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj10aGlzLlNnKCk7dGhpcy53Yz10aGlzLkVmKCk7dGhpcy51Yz10aGlzLmFpKCk7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuT2Y/RC5jZTpELlRmfSkpfSx3bTpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5RYSh3LlNmLHtkZXB0aDpifSkpfSwKT2M6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy5zbSgpP3RoaXMubW8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5iaCgpLGcse0FkU3lzdGVtOnRoaXMud2woKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlFhKHcuVmYpKTooYj0wLHRoaXMuem8oKSYmdGhpcy5oZih0aGlzLmJsKCkpKX0sYmY6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LmJmKCl9LHloOmZ1bmN0aW9uKCl7dGhpcy51Yz8odGhpcy51Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC55aCgpfSx6bzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpvKCk/dGhpcy5pbygpPyEwOigtMSE9dGhpcy5HYygpP3RoaXMucWEodGhpcy5RYSh3LlhkKSk6dGhpcy5xYSh0aGlzLlFhKHcuUmYpKSwhMSk6KHRoaXMucWEodGhpcy5RYSh3LlljLApELlVmKSksITEpfSxoZjpmdW5jdGlvbihhKXt0aGlzLm1hfHwodGhpcy5tYT0iIik7YS5XZHx8KGEuV2Q9W10pO2EuV2QucHVzaCh0aGlzLmhoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuWWUoKSk7YS53Yj1hLndiP2Eud2I6dGhpcy53YzthLnRjPWEudGM/YS50Yzp0aGlzLnVjO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZzt0aGlzLnBhcmVudC5oZihhKX0sYmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgUmE7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuZHVyYXRpb249dGhpcy5HYygpO2EuTT10aGlzLlpnKCk7YS5kYz10aGlzLnpsKCk7YS5rcT1bXTthLm9yaWdpbj10aGlzO2EudT10aGlzLnZsKCk7YS5BZj10aGlzLk5sKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8Cih0aGlzLm1hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuT2c7aWYoIXRoaXMuSiYmdGhpcy5sYSYmdGhpcy5sYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLmxhO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGM9ITE7KGM9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmYy5sZW5ndGgmJmUudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuTWE9YS5lcnJvci5jb2RlIT13LlhkLmNvZGU/YS5NYS5jb25jYXQodGhpcy5BbCgpKTphLk1hLmNvbmNhdCh0aGlzLkpsKCkpKTt0aGlzLlYubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYyYmdGhpcy5wYXJlbnQuZmMoYSksYj0wLHRoaXMuT2MoKSk6Cih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5xYSYmdGhpcy5wYXJlbnQucWEoYSksYj0wKX0sZmM6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZmMoYSl9LEhnOmZ1bmN0aW9uKGEsYil7dGhpcy5xYSh0aGlzLlFhKGEsYikpfSxRYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBTYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIGI8Z30sam86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlpnKCkubGVuZ3RofSxpbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuR2MoKX0sRWY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlYuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxhaTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuViYmMjw9dGhpcy5WLmxlbmd0aCYmCiF0aGlzLkVmKCkmJihhPSEwKTtyZXR1cm4gYX0sY246ZnVuY3Rpb24oYSl7dGhpcy5tYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm1hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubWE9IlVOS05PV04ifXRyeXt0aGlzLk9mPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSx3bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sWWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMub2goYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLm9oKGEucGFyZW50Tm9kZSk6ITF9LEpsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEFsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx6bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxPYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksRXA6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuT2F8fDFFMzt0cnl7dmFyIGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksYj1nLmNvbmNhdChlKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMudWQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sTmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5SbihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LERlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sR2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMudWQoYSk6IiJ9LHVkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLkdlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ha3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmxqfHxUYTtuZXcgVGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk1hPVtdO3RoaXMuTT1bXTt0aGlzLmRjPSIiO3RoaXMudT10aGlzLnRjPXRoaXMud2I9ITE7dGhpcy5LZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuTGU9IiJ9Yy5Kaj1hO2EucHJvdG90eXBlPXtXazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxIbDpmdW5jdGlvbigpe2lmKCF0aGlzLktlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubGEpe3ZhciBhPXRoaXMub3JpZ2luLmxhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGM9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1jLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLktlPWFbZF0pfXJldHVybiB0aGlzLktlfSxYZzpmdW5jdGlvbigpe2lmKHRoaXMuTGUpcmV0dXJuIHRoaXMuTGU7dmFyIGE9IiI7KGE9dGhpcy5IbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuTGU9YX0sUmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bY107cmV0dXJuIGF9fX0pKGMpO3ZhciBSYT1jLkpqfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkxpfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e2VlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLExhOiJYTUxfUEFSU0VfRVJST1IifSxSZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTGE6IkRVUkFUSU9OX0VSUk9SIn0sWWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLExhOiJFTVBUWV9WQVNUIn0sVmY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkxhOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxTZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixMYToiTE9BRF9FUlJPUiJ9LCRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixMYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LAplcDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixMYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTGE6IkRVTU1ZX0FEIn19LEQ9e1RmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTGE6Ik5PX0FEUyJ9LFVmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixMYToiTk9fTUVESUFGSUxFUyJ9LGZwOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLExhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sY2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlvPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFZhPWMueW98fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5lcnJvcj1hO3RoaXMucGQ9Yzt0aGlzLk1hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFNhPWMuT2l8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMuTml8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5QaD1hO3RoaXMudmlkZW89Yzt0aGlzLlRkPVtdO3RoaXMuTWg9W107dGhpcy5kZj1bXTt0aGlzLkpvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSygpfWMuZ3A9YTthLnByb3RvdHlwZT17SzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5QaC5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLlBoW2FdLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suWnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmhuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5UZC5wdXNoKHtzcmM6ZCxmcmFtZTpoLFNtOmUsdmVuZG9yOmMuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7Yzx0aGlzLmRmLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuZGZbY107ZC50eXBlPT09YSYmZC5Jayh0aGlzLkJsKGEpKX19LApCbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpcTohMCxocTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntWcDoidmlkZW8iLGxxOiJqc0N1c3RvbSIsbXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxucToxLEZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sClFsOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5UZC5sZW5ndGg7YysrKWlmKHRoaXMuVGRbY10udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5UZFtjXS5TbTtyZXR1cm4iIn0scm46ZnVuY3Rpb24oYSxjKXt0aGlzLk1oLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlFsKGMpLHZlbmRvcjpjfSk7dGhpcy5UbigpfSxobjpmdW5jdGlvbihhLGMpeyJ2aWRlbyI9PT1hP3RoaXMuSm8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMua2coYSxjKX0uYmluZCh0aGlzKSk6dGhpcy5rZyhhLGMpfSxrZzpmdW5jdGlvbihhLGMpe3RoaXMuZGYucHVzaCh7dHlwZTphLElrOmMsZnE6ITF9KX0sVG46ZnVuY3Rpb24oKXt0aGlzLk1oLm1hcChmdW5jdGlvbihhKXthLmxtfHwoYS5ZcCh7YWRTZXNzaW9uSWQ6ZS5YKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5qcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmxtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMudG18fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMua2I9YS5UZygpO3RoaXMuST1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkkuaWQ9ZS5YKDEwKTt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5OYT17fTt0aGlzLmxnPSExOwp0aGlzLmFjPVtdfWMuS2k9YTthLnByb3RvdHlwZT17dWw6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxlPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGU9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6ZSx5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy51bChhKTtmb3IodmFyIGM9MCxkPTAsZT0hMSxoPXRoaXMuWmwoYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMH0sbGk6ZnVuY3Rpb24oKXt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEVoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5jLmwoKSl9LHVuOmZ1bmN0aW9uKCl7dGhpcy5sZ3x8Cih0aGlzLmMucGxheSgpLGUubyhrLm1kLHRoaXMuYy5sKCkpKX0seWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSS5zdHlsZS56SW5kZXg9YTt0aGlzLkkuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5JLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkkuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkkuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTsKdGhpcy5jLlJjJiZ0aGlzLmMuUmMoKT90aGlzLmMuVGcoKS5hcHBlbmRDaGlsZCh0aGlzLkkpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5JKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxabDpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gZH0sc2w6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTtjLnBvc2l0aW9uP2MucG9zaXRpb249Yy5wb3NpdGlvbjpjLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy53aWR0aD1hLm9mZnNldFdpZHRoO2MuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gY30saGM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zbCh0aGlzLmtiKTtpZihjLnghPXRoaXMuTmEueHx8Yy55IT10aGlzLk5hLnl8fGMucG9zaXRpb24hPXRoaXMuTmEucG9zaXRpb258fGMud2lkdGghPXRoaXMuTmEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLk5hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk5hLndpZHRoJiYwPHRoaXMuTmEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5JZSgpO3JldHVybn10aGlzLk5hPWM7dGhpcy5jLlJjKCk/KHRoaXMuSS5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSS5zdHlsZS50b3A9IjBweCIpOih0aGlzLkkuc3R5bGUubGVmdD1jLngrInB4Iix0aGlzLkkuc3R5bGUudG9wPWMueSsicHgiKTt0aGlzLkkuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9Yy5oZWlnaHQrInB4Ijt0aGlzLkkuc3R5bGUucG9zaXRpb249Yy5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuYWMubGVuZ3RoO2ErKyl0aGlzLmFjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWUuRGYodGhpcy5JKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5hY3x8KHRoaXMuYWM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmFjLnB1c2goYSl9LEllOmZ1bmN0aW9uKCl7dGhpcy5JJiZ0aGlzLkkucGFyZW50Tm9kZSYmdGhpcy5JLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSSk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuS2l8fFlhLEI9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPQplLlgoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgJGE9Yy5UaXx8JGE7bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5HZChhKTt0aGlzLkNnKCl9LEdkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYWI9Yy5Eanx8YWI7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWNhKCk7dGhpcy5ZYj10aGlzLllifHwhMTt0aGlzLmNnPXRoaXMuZWc9CnRoaXMubGg9dGhpcy51YT10aGlzLkdmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLkdmPSEwO3RoaXMubGgmJnRoaXMudWcoKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmpjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMua2QoKTt0aGlzLmxoPSEwO3RoaXMudWcoKX0uYmluZCh0aGlzKSk7CnRoaXMucGcoKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5ZYil7dGhpcy5rZCgpO2lmKCF0aGlzLkdmJiYhdGhpcy5rZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuR2YmJnRoaXMuY2cmJiF0aGlzLmVnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LCRnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGIubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1iLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YSlyZXR1cm4gZC5pbnN0YW5jZX19LHBnOmZ1bmN0aW9uKCl7aWYodGhpcy5rZCgpKXt2YXIgYT0KdGhpcy4kZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLmVnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuY2c9YS5DcH10aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLlRwKCk6ITF9LEdjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5HYygpOi0xfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxxbDpmdW5jdGlvbihhLGIpe3RoaXMuWWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuWWJ8fDMwMj09dGhpcy5ZYj90aGlzLnVhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5ZYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksMTAwKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE/KHRoaXMudygpLHRoaXMub2EoKSk6YS5NZSgpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLktsKGEpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuQ2p8fGJiOyhmdW5jdGlvbihjKXtjLkVqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbm06ZnVuY3Rpb24oKXt3aW5kb3cuT08uTmoubmsubGs/d2luZG93Lk9PLk5qLm5rLmxrLkFwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWNhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkZlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBhYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgYmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIGNiPWMuRWp8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMub289YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBlYj1jLm9vfHxlYjtuZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLkhoKCl9LEhoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5VJiYoMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcyksMTAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0scmc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmcoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMucmcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5yZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuRWl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sS2g6ZnVuY3Rpb24oYSl7YT1uZXcgZmIoYSk7YS5qYT90aGlzLlAoKTp0aGlzLkwoYSl8fChhLkdkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk4oYSksKG5ldyBnYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLnJsfHwodGhpcy5ybD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuS2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLktoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGhiPWMuR2l8fGhiLFM9bmV3IGhiKHIpO1MuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGliPWMuaGx8fGliO25ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFQ9Yy5Xanx8VDsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LmNkKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguY2QoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5QbShhKX0uYmluZCh0aGlzKSk7eC5jZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKTt4LmNkKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5VbCgpfSxQbTpmdW5jdGlvbihhKXt2YXIgYj0iIixjO2ZvcihjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7Yj1pc05hTihhW2NdKT8hMTphW2NdO2lmKDEwMDk9PWFbY118fDEwMDE9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKXt0aGlzLncoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2NdKWlmKGFbY10uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbY11bZF0pPyExOmFbY11bZF0sMTAwOT09YVtjXVtkXXx8CjEwMDE9PWFbY11bZF18fDMwMz09YVtjXVtkXXx8NDAzPT1hW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkQoKX19KX0pKGMpO3ZhciBVPWMuVmp8fFU7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO3RoaXMuQWQmJihhPWUuZGwoYSx0aGlzLkFkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFQoZCk7aWYoIXRoaXMuTChkKSl7dGhpcy5OKGQpOwp2YXIgZj1uZXcgVShkLHRoaXMuRyk7Zi5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuQWR8fCh0aGlzLkFkPVtdKSx0aGlzLkFkLnB1c2goYVtiXSksZD1uZXcgVChoKSx0aGlzLkwoZCl8fCh0aGlzLk4oZCksZj1uZXcgVShkLHRoaXMuRyksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxjZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGMpfSxubzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLk5jfHwKKHRoaXMuTmM9W10pLHRoaXMuTmMucHVzaChhKSx0aGlzLnRuKCkmJih0aGlzLnBmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bY10mJjA8dGhpcy5hYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmFhW2JdW2NdLmxlbmd0aDtkKyspdGhpcy5hYVtiXVtjXVtkXShhKX19LFVsOmZ1bmN0aW9uKCl7aWYodGhpcy5OYylmb3IodmFyIGE9MDthPHRoaXMuTmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5OY1thXSxjPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbY11bZF0mJjA8dGhpcy5hYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmFhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5hYVtjXVtkXVtlXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4Lm5vKGEpfX0pfSkoYyk7dmFyIGpiPWMuWGp8fGpiLHg9bmV3IGpiKHIpO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2I9Yy5ibnx8a2I7bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sd2E6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBsYj1jLkJpfHxsYjsoZnVuY3Rpb24oYyl7Yy5DaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkQoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbWI9Yy5DaXx8Cm1iOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbGIoZCk7dGhpcy5MKGgpfHwodGhpcy5OKGgpLChuZXcgbWIoaCx0aGlzLkcpKS5mKCkpfWNhdGNoKGspe319dGhpcy5QKCl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihiPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYj1jLk1pfHxwYjtuZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLndnPXRoaXMuRWM9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dmFyIGI9dGhpcy5KZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuRWM9Yik7aWYoIXRoaXMud2cmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fAphLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixhLnNvdXJjZS5DSE9PU0VSX0FCfHwiIiwhMCk7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixjLCEwKTt0aGlzLndnPSEwfX19Y2F0Y2goaCl7fX0uYmluZCh0aGlzKSk7dGhpcy5WZygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuZ24odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSxWZzpmdW5jdGlvbigpe2lmKHRoaXMuRWMpcmV0dXJuIHRoaXMuRWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuSmcoYSkpcmV0dXJuIHRoaXMuRWM9CmF9fSxKZzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiZhLnZpZGVvU2xvdCYmKGI9YSk7YSYmYS5oZHZwYWlkJiYoYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZ246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiYKdGhpcy5lYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5tdXRlJiZ0aGlzLmVhLm11dGUoKX0uYmluZCh0aGlzKSk7YSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sbWg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy55anx8cWI7KGZ1bmN0aW9uKGMpe2MueGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLnRpJiYodGhpcy5nKCksdGhpcy50aT0hMCx0aGlzLmthKCkpOwpiLkdhKCkuYWRkRXZlbnRMaXN0ZW5lcihhLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuVmcoKT90aGlzLkQoKToodGhpcy55ZXx8KHRoaXMueWU9MSksdGhpcy55ZSsrLDEwMDx0aGlzLnllP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy54anx8cmI7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLkwoYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTsKdmFyIHNiPWMuemp8fHNiLFY9bmV3IHNiKHIpO1YuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5RbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRiPWMuUW18fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5VPygwLHRoaXMuVSkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZmt8fHViOyhmdW5jdGlvbihjKXtjLmVrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEljOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSwKYT1hLmdldFJhd1BsYXllcigpO3JldHVybiBhLmltYUFkc0xvYWRlcn0sZW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMub2EoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMuZ2V0UGxheWVyKCk7CnRoaXMuQmE/dGhpcy5lbih0aGlzLkJhKToodGhpcy5CYT10aGlzLkljKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuRCgpO3JldHVybn1pZighdGhpcy54Yyl7dGhpcy5EKCk7cmV0dXJufWE9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmViLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmViW2JdJiYzMDMhPXRoaXMuZWJbYl0mJjQwMyE9dGhpcy5lYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMub2EoKTtlbHNle3RoaXMuRCgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZWt8fHZiOyhmdW5jdGlvbihjKXtjLmdrPQp0LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlRhPS0xO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5MKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuZ2t8fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmJtfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuamY9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLldtKCl9LmJpbmQodGhpcyksNTAwKX0sV206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5VJiZ0aGlzLlUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksCmI9MDthLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYj1hLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuamYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuamYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXbjpmdW5jdGlvbigpe3RoaXMuamY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLlJqfHwKemI7KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnBjPTB9LGY6ZnVuY3Rpb24oKXt0aGlzLkVtPTEwO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5wY3x8KHRoaXMucGM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5nKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5wY3x8dGhpcy5wYysrLHRoaXMucGM8PXRoaXMuRW0/KHRoaXMucGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5XbigpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5Ranx8QWI7KGZ1bmN0aW9uKGMpe2MuU2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSwKdGhpcy5HKSkuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgQmI9Yy5Tanx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIERiPWMueG98fERiO25ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0iIjthLmN1cnJlbnRUaW1lJiYoYj1hLmN1cnJlbnRUaW1lKTtyZXR1cm4gYn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sS2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5VKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuUGp8fEViOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5HYSgpLGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZztiJiZiLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7YS5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5CYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMudW0oKTp0aGlzLnRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5nKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LFhrOmZ1bmN0aW9uKCl7dGhpcy5hZygpfHx0aGlzLmcoITApfSx1bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQmIoKTshYS5uYSYmYS5WJiZhLnpwJiZhLkJwJiYodGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZygpKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7YS5hZHNMb2FkZXI/YS5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2gpZm9yKHZhciBhPQpjLlpjLkJiKCksYj10aGlzLmdldFBsYXllcigpLkdhKCkuaWQsZT0wO2U8YS5sZW5ndGg7ZSsrKWFbZV0uaWQ9PWImJih0aGlzLkNoPWFbZV0pO3JldHVybiB0aGlzLkNofSxVcDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxnOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2E/dGhpcy5CYigpLmFkc0xvYWRlcj90aGlzLkQoITApOnRoaXMuRCgpOnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLk9qfHxGYjsoZnVuY3Rpb24oYyl7Yy5aYz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBrOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgRmIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Yy5aYy5CYigpO2lmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuUGsoYVtiXSk7dGhpcy5QKCl9fSk7Yy5aYy5CYj1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKGwmJmwucGxheWVyYXBpJiYoYT1sLnBsYXllcmFwaSgpKSYmYS5sZW5ndGgpcmV0dXJuIGE7dmFyIGE9W10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSwKYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCksYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kKTtpZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5aY3x8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuJGl8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnVqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RSYmKGE9YS5maXJzdENoaWxkKTtpZihhKXt0aGlzLlQoYSk7aWYoYS50YWdOYW1lKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1iP3RoaXMuVyhiKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxTcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYzpmdW5jdGlvbigpe3JldHVybiEwfSxHYTpmdW5jdGlvbigpe3ZhciBhO0U/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9CmMudWp8fFc7KGZ1bmN0aW9uKGMpe2MudGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMua2Y9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5rZj1hLmlkKTtFP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLmtmJiZjIT10aGlzLmtmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuJHApLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy50anx8WDsoZnVuY3Rpb24oYyl7Yy52aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRSlmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBXKGEpLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBYKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmphP3RoaXMucGYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEUsSmI9Yy52anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLlVtfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5ZaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLApjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlooKSk6dGhpcy5aKCk6dGhpcy5aKCk6dGhpcy5aKCl9LHduOmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxYcDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBNYj1jLllpfHxNYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5xZygpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMua2EoKX0uYmluZCh0aGlzKSl9LHFnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLkdldEFkRXJyb3JzQ2FjaGUoKSxjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5oYW5kbGVFcnJvcihiW2NdKTthLkNsZWFyQWRFcnJvcnNDYWNoZSgpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT0KYSl0aGlzLnFnKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuZygpKX19LGc6ZnVuY3Rpb24oYSl7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIE5iPWMuWGl8fE5iOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7YXx8KGE9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYSYmYS5HZXRBbGxQbGF5ZXJzJiYoYT1hLkdldEFsbFBsYXllcnMoKSkmJjA8YS5sZW5ndGgpZm9yKHZhciBiPQowO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTWIoYVtiXSk7Yy5qYXx8dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgTmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIE9iPWMuWml8fE9iLFBiPW5ldyBPYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYj1jLkltfHxRYjtuZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTsKYnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWigpfSxSZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sZm46ZnVuY3Rpb24oKXt0aGlzLlhjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWGN8fCh0aGlzLlhjPSEwLHRoaXMuUmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlhjJiYodGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlhjPSExKSx0aGlzLlJkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgUmI9Yy5qa3x8UmI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sTGg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxoLmJpbmQodGhpcyksMTApfSxiYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMub2s9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuZygpKToodGhpcy5va3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuZygpKX0sWWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuYmMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLllmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuTGgoKTt0aGlzLllmKCk7dGhpcy5qbigpfSxqbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmRuP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLmRuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuYmMoYSkpfX0pfSkoYyk7dmFyIFNiPWMuaWt8fFNiOyhmdW5jdGlvbihjKXtjLmtrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEuZm4oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgVGI9Yy5ra3x8VGIsVWI9bmV3IFRiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLmpsfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLkZoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLkptPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX1lbHNlIHRoaXMuWigpfSx3bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KbX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUGQoYSl9LmJpbmQodGhpcykpfSxQZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5GaCYmKHRoaXMuRmg9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLlpqfHxOOyhmdW5jdGlvbihjKXtjLllqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5CZSlpZih0aGlzLkhifHwKKHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuSm4oKTp0aGlzLmcoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuZygpOnRoaXMuZyghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkJlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuY2EoYSk7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5Zanx8TzsoZnVuY3Rpb24oYyl7Yy4kaj0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVGE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5wZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFdiPWMuJGp8fFdiLFhiPW5ldyBXYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYj1jLkVrfHxZYjtuZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnFqfHxZOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmloPTA7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmVkPSExO3RoaXMuSmg9ZS5MYigxMCk7dGhpcy5xaCgpfSxxaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnNiKCksITA7dGhpcy5paCsrO2lmKDEwPHRoaXMuaWgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuZyghMCk6dGhpcy5nKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5xaC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLnVhPQohMH0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgWj1jLnBqfHxaOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWSh3aW5kb3cucGxheWVyKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLnJqfHxaYiwkYj1uZXcgWmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy4kbHx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5WaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2coKX0sc2c6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBjYz1jLlVpfHwKY2M7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmphKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYz1jLldpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmM9Yy5Va3x8ZmM7bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLndpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy53aXx8Z2M7KGZ1bmN0aW9uKGMpe2Mudmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpO3RoaXMuc2UoKTt0aGlzLm9nKCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LENhOmZ1bmN0aW9uKCl7dGhpcy51YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sb2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5vYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9nLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuc2UuYmluZCh0aGlzKSwxMDApfSxzZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMudml8fGhjOyhmdW5jdGlvbihjKXtjLnhpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT0KbmV3IGdjKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgaGMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuUmEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlJhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMueGl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLm5sfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMucmg9dGhpcy50aD10aGlzLnNoPSExO3RoaXMuQ2Q9W107dGhpcy5vZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHphP251bGw6emEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgUz9udWxsOlMsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFViP251bGw6VWIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Maj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLkxsKGEpOltdLGM7dGhpcy50aD0hMDtpZihhLmxlbmd0aCl7dGhpcy5zaD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sCnRoaXMuUmgoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLm9mKXtpZih0aGlzLnJoKWJyZWFrO2M9dGhpcy5vZltkXTt0aGlzLkpmKGMpJiYodGhpcy5DZC5wdXNoKGMpLHRoaXMuUmgoYykpfX0sSmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxMbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZD1hW2VdLGQ9dGhpcy5vZltkXSx0aGlzLkpmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LFJoOmZ1bmN0aW9uKGEpe3RoaXMuSmYoYSkmJmEuZigpfSxZbjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuc2gpZm9yKHRoaXMucmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uU2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5TYil9fX0pKGMpO3ZhciBsYz1jLkxqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5nbHx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRmMoay5BbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsCmMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTt2YXIgRz1uZXcgSCxsPSExO0cuZmEoKTtHLm5oKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5mYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcubmgoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LAohMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuTmcod2luZG93LEcuZG0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5TaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy54ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTt0aGlzLkVkPTA7dGhpcy5JaD0hMTt0aGlzLmxmPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnlpPWE7YS5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3RoaXMuR2g9YX0sdmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmJiPXRoaXMucGxheWVyLlIoKX0sCmdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQW46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx6bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTsKdmFyIGQ9ITEsZj0hMTtpZih0aGlzLmVtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5wYSx0aGlzLm5iLm5mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMudm4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuJG4oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsaCk7bC54bih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuRG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5TaChsKX19LGVtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy54ZC5nZXRUaW1lKCksdGhpcy54ZD1hLDNFNTxjPyEwOiExO3RoaXMueGQ9YTtyZXR1cm4hMX0sUW46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS51ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLklnKGEpKT90aGlzLlNjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksCjApLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfSxQbjpmdW5jdGlvbihhKXtpZighdGhpcy5HaCl7ZS51ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuRm4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSWcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsubWQsdGhpcy5wbGF5ZXIubCgpKSl9fSxJZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sbW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Nbih0aGlzLlBuLmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5LYSgpfSxJZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS51ZigibWlkcm9sbCIpO2lmKCF0aGlzLndoKXt0aGlzLndoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfX0sbG46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Fbih0aGlzLklkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlplKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlFuKCk7dGhpcy5wbGF5ZXIuWmUmJnRoaXMubG4oKTt0aGlzLm1uKCl9LG5uOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkRkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5jcChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRWQ9dGhpcy5EZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkVkJiYoYT0hMCk7cmV0dXJuIGF9LHZuOmZ1bmN0aW9uKGEpe3RoaXMuSWg9YTtmb3IoYT0wO2E8dGhpcy5EZC5sZW5ndGg7YSsrKXRoaXMuRGRbYV1bImZ1bmN0aW9uIl0odGhpcy4kbS5iaW5kKHRoaXMpKX0sJG06ZnVuY3Rpb24oYSl7dGhpcy5FZC0tO2EmJnRoaXMubGYucHVzaChhKTswPj10aGlzLkVkJiZ0aGlzLkloKCl9LERtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLmxmLmxlbmd0aDtkKyspYz0KdGhpcy5sZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy55aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnBsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoZWVCaWNoYWhNaWFNZWVHaCxlZUJpY2hhaE1pYU1lZUdoKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
144.76.115.236
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.236.115.76.144.clients.your-server.de
- Software
-
openresty/1.15.8.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 8F76
|
241 B
0
|
|
Script
text/javascript |
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.giga.de/5244e16181ab0c7d546b0838eebe2f946c893cac/
Frame 34FB
|
109 B
671 B
|
4ms
4ms
|
XHR
application/json |
144.76.115.236
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.giga.de/5244e16181ab0c7d546b0838eebe2f946c893cac/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGVlQmljaGFoTWlhTWVlR2g9ZWVCaWNoYWhNaWFNZWVHaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZmZ8fCh4LmZmPTApO3guZmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5mZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5IayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2IudmYoYyk7Yi5BbihtKTtiLnpuKGwpO2Iubm4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Jbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS51aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5pbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGs9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlptLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5naD17fTt0aGlzLnNmPSExfWMuY2o9YTthLnByb3RvdHlwZT17Wm46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnNmfHwodGhpcy5zZj1lLlgoMTApKTtyZXR1cm4gdGhpcy5zZn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmdoW2JdJiYodGhpcy5naFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlpuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx6azpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sWm06ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuWW0oYi5kYXRhKX0sWW06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxCZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5XZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMueWQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxXZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx4azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnRsKGIpKXJldHVybjsoYT10aGlzLkJnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx0bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFVnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxLbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHhmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuYWwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuS24oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sSms6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGFsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5KayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxEZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxwaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFRoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGttOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scWQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAphbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxGajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxoazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQWkoKXx8Yi5IaSgpfHxiLmFtKCl8fGIuRmooKXx8Yi5oaygpfHxiLnNqKCl8fGIuVWooKX19O3JldHVybiBudWxsIT1iLkRrKCl9LHlsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxkbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxSbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxRZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMua2koYSkrIjoiK3RoaXMua2koTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGtpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx1ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE5nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxhbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk1sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sU246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLnZhKGIsITApO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS52YShmLCEwKTtmPW0udmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFFkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uT2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnVkKGIpOiIifSx1ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG1nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5wbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnFmJiZ3aW5kb3cuc2FuZGJveC5xZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLkxnKGIpKXJldHVybiB0aGlzLkxnKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS53ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy54ayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHlkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5bTpmdW5jdGlvbihiLGEsZCl7dGhpcy55ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx1aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMueW0oZi53ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGNwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxGazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0saW06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmJqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWm89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5rbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmJwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuZ2c9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuWmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5kZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5oZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EucGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuYmc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Gbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS4kbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLlprPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5tZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5mZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eucms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5iZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnFrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5yaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuemQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS55Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuWW89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQm89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Bbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLmZsfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxJbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnRkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudGQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG5oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5JbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnRkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmRqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuSWk9YX0pKGMpO3ZhciBLPWMuSWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Ca3x8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Laj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5CbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scGY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sR2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudGgmJkwuWW4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxqbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLktqfHx0OyhmdW5jdGlvbihjKXtjLk1qPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5EZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTW46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRW46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sR2Q6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnRrKCk7dGhpcy5HZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHRrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxTaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LE9oOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkRnfHwodGhpcy5EZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLk1qfHxxOyhmdW5jdGlvbihjKXtjLnppPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuV2Y9IjEiO3RoaXMuWGY9IjIiO3RoaXMubWs9IjMiO3RoaXMuJGM9MDt0aGlzLkZtPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5pZz10aGlzLm1pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMudmYoYSk7dGhpcy5DbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm1pfHwodGhpcy5taT0hMCxlLlhlKCkpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGNtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0sZ206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMud2YoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmNtKCk7aWYoIXRoaXMuZ20oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMud2YoKTtyZXR1cm59dGhpcy53ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuZ2koKTt0aGlzLmlnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy56YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGdpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldmfSx3ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWGZ9LEpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ta30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxhZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5XZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWGZ9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx2ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxHbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEJtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy56aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Canx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLnRvfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuS2coKTt0aGlzLk1nKCk7dGhpcy5Zaz0hMX0sS2c6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5JZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSWQoYil9LmJpbmQodGhpcykpfSxJZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5uanx8cmE7KGZ1bmN0aW9uKGMpe2MubWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5rZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgZz0wO2c8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7ZysrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbZ10udGFnKXt0aGlzLnliPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueWI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMueWI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0KImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPGQubGVuZ3RoO2crKylhLm9uKGRbZ10sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtnXSYmKHRoaXMuaGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtnXSYmdGhpcy5BaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkZtJiYhdGhpcy56YSgpJiYodGhpcy55Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLApmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLllrPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5CZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmFkLmluZGV4T2YoYikmJnRoaXMuYWQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmFkLmxlbmd0aD49dGhpcy5rZSYmdGhpcy5nKCkpfSwKQm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRGYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmhlfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuS2coKSxiLk1nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLm1qfHxzYTsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT0KdGhpcy5DbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKWEucHVzaChiW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpO3RoaXMuTChnKXx8dGhpcy5qbShnKXx8KHRoaXMuTihnKSxnPW5ldyBzYShnLHRoaXMuRyksZy5LKCksZy5mKCkpfX10aGlzLlAoKX19LEpwOmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LENsOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihhLmFuY2hvcil9fSl9KShjKTt2YXIgdGE9Yy5vanx8dGEsdWE9bmV3IHRhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuYm98fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmNrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEpe3ZhciBiPWEuZWxfO2J8fChiPWEuZWwoKSk7Yj8odGhpcy5UKGIpLChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYSl7dGhpcy5QZChhKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFiWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuYXV0b3BsYXk/YS5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHdhPWMuY2t8fHdhOyhmdW5jdGlvbihjKXtjLmJrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5LYz10aGlzLkJhPXRoaXMuZWQ9ITE7dGhpcy5KaD1lLkxiKDEwKTt0aGlzLklmPSEwO3RoaXMueGM9dGhpcy5raD0hMTt0aGlzLkttKGEuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy56aCgpLHRoaXMuS2soKSx0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGEuViwiOyIsdHlwZW9mIGEuViwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYS5WP2EuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGEuVj90eXBlb2YgYS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYS5pbWEsIjsiLHR5cGVvZiBhLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGEuSCwiOyIsdHlwZW9mIGEuSCwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLmltYT9hLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5pbWEmJmEuaW1hLkVhP2EuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IixhLmltYSYmYS5pbWEuRWE/dHlwZW9mIGEuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5mZToKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixhLkg/YS5ILmZlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILmdlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZ2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/CnR5cGVvZiBhLkgubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5xZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuSmgpfSxIYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5pbWEzJiYodGhpcy5pbWE9YS5pbWEzKTtpZihhLmltYSl7dGhpcy5pbWE9YS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LEljOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmEpe3ZhciBhPXRoaXMuSGMoKTthJiYoYS5hZHNMb2FkZXImJih0aGlzLm5hPWEuYWRzTG9hZGVyKSxhLl9hZHNMb2FkZXImJih0aGlzLm5hPWEuX2Fkc0xvYWRlciksYS5nZXRBZHNMb2FkZXImJih0aGlzLm5hPWEuZ2V0QWRzTG9hZGVyKSxhLmNvbnRyb2xsZXImJmEuY29udHJvbGxlci5zZGtJbXBsJiZhLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm5hPWEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm5hfSxZZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGhtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuamgpe3ZhciBhPQp0aGlzLkhjKCksYj10aGlzLmZtKCk7d2luZG93LmltYSYmYSYmKGEuX2Fkc0xvYWRlcnx8YS5hZHNMb2FkZXJ8fGIpJiYodGhpcy5qaD0hMCl9cmV0dXJuIHRoaXMuamh9LGZtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5lZCYmYS5hZHMmJihhLmFkcy5zdGF0ZXx8YS5hZHMuX3N0YXRlKSYmKHRoaXMuZWQ9ITApO3JldHVybiB0aGlzLmVkfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWMoKTtpZihhKXt2YXIgYj0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rbigpfS5iaW5kKHRoaXMpKSwKYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxrbjpmdW5jdGlvbigpe3RoaXMueGM9ITA7dmFyIGE9dGhpcy5ZZygpO2lmKGF8fHRoaXMuemEoKSl7dmFyIGI9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5jYShiKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuU2EoKSYmKGQ9Ik1fIik7YS5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDsKaWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYi5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnljfHwodGhpcy5tKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5iYSgpLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LElwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5BZyYmYS5hZHMmJih0aGlzLkFnPWEuYWRzKTtyZXR1cm4gdGhpcy5BZ30sS2s6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7CnRoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLkFoKCl9LmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YSYmKChhPXRoaXMuWWcoKSkmJmEuZGVzdHJveT9hLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoKX0uYmluZCh0aGlzKSw1MCkpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcoKSYmMDxhLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5obSgpKXt2YXIgYj10aGlzLkhjKCksZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLncoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5raD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8KKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMua2g9ITA7YS5pc1BsYXlpbmcoKSYmMTA8YS5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDUwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sTGs6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpOwpyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGsoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIGUueGU/ITE6dGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXtpZih0aGlzLllsKCkpe3RoaXMudWE9ITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXRoaXMuSWY9ITEsZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsInNldCIsITApO3RoaXMuZyghMCl9ZWxzZSB0aGlzLnVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpfSxZbDpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPQohMTtlLnlkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2E9IWUuZmIoYi5jYyl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthPSExfSwhMCwhMCk7dmFyIGI9ZS55bCgpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUueGU9LTEhPWIuaW5kZXhPZigiZmlyZWZveCIpfHwtMSE9Yi5pbmRleE9mKCJzYWZhcmkiKXx8YX1yZXR1cm4hMX0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy56YSgpfHwoYXx8KHRoaXMuSWY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSWYsZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApUazpmdW5jdGlvbigpe3RoaXMuUnB8fCgxMDx0aGlzLkxvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuTG8rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5zbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxzbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Nbyl7dGhpcy5Nbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmEudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5kaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuWGgod2luZG93KTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl0cnl7Yj1ifHx0aGlzLlhoKGFbZ10pfWNhdGNoKGQpe310aGlzLlAoKX19LFhoOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTt2YXIgeWE9Yy5ka3x8eWEsemE9bmV3IHlhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Baj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEFhPWMuQWp8fEFhO25ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuZ2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTsKcmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5XKGEpOnRoaXMuWigpfSxWbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZiLGc9dGhpcy5oYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5qYyYmKDA8PWcuaW5kZXhPZihkKXx8Yi5CZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuZ2Y9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKd2E6ZnVuY3Rpb24oKXt0aGlzLmdmKys7aWYoMTA8dGhpcy5nZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgphJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7dmFyIEJhPWMuSGp8fEJhOyhmdW5jdGlvbihjKXtjLkdqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5IYisrLDE1PHRoaXMuSGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPQohMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpOwp2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm9sPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5vbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlZtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Hanx8Q2E7KGZ1bmN0aW9uKGMpe2MuSWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBCYShhW2JdKTtnLmphfHx0aGlzLkwoZyl8fCh0aGlzLk4oZyksKG5ldyBDYShnLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Janx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuVGx8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlVnKGEsImVsZW1lbnRJRCIpOwpzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLlhtPWEucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1hLndpZHRoO2cuc3R5bGUubWluV2lkdGg9YS53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5YbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5yZD1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMucmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnJkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sU2s6ZnVuY3Rpb24oKXtlLnBoKHRoaXMucmQpO2UuT2UodGhpcy5yZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5qanx8R2E7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaWp8fEhhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiYKbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5VZyhhLCJlbGVtZW50SUQiKTtpZihlLnBoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmtqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy53anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPQoiR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxEbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHVrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixnLGQsZil7dGhpcy5YYT1iO3RoaXMuUGc9dGhpcy51aT0hMTt0aGlzLkJoPWQ7dGhpcy5ZaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmCjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJm0mJm0uUmUodGhpcy5YYS51cmwpJiZtLlZjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5EbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiKwpkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlBnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0aGlzLmhiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5ZaD90aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy51aXx8KHRoaXMuaGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwKInJlcXVlc3RfZmFpbGVkIiwhMCk6bS5SZSh0aGlzLlhhLnVybCksdGhpcy5CaCYmdGhpcy5CaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9Yy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkRhPXRoaXMuYmU9ITF9Yy5KaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihiKXt0aGlzLmJlPWJ9LEduOmZ1bmN0aW9uKGIpe3RoaXMuRGE9Yn0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIiwicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIiwKdnA6IkFkU2tpcHBlZCIsd3A6IkFkU3RhcnRlZCIsbHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixtcDoiQWRJbXByZXNzaW9uIixpcDoiQWRDcmVhdGl2ZVZpZXciLHBwOiJBZFZpZGVvTWlkcG9pbnQiLHFwOiJBZFBhdXNlZCIsc3A6IkFkVmlkZW9TdGFydCIsdHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5iZSxhW2RdKX0scG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmFlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmFlKXRoaXMuRGEuYWUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuRGEsdGhpcy5EYS5hZVthXSk7dGhpcy5EYSYmdGhpcy5EYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYS5nZXRFcnJvcigpO2ImJmNvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsImdvdCBlcnJvciIsYil9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5iZSYmdGhpcy5xbigpO3RoaXMuRGEmJnRoaXMucG4oKX19fSkoYyk7dmFyIE1hPWMuSml8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IYT0hMTt0aGlzLiRiPSIiO3RoaXMuZmQ9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5HZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm5mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuWmQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7CnRoaXMuWWQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnZiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLldiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLlBiPSIiO3RoaXMuUWI9W107dGhpcy5SYj1bXTt0aGlzLlVjPVtdO3RoaXMub2M9IiI7dGhpcy5BYj0hMTt0aGlzLk9kPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaWM9ITE7dGhpcy52Zz10aGlzLlVkPW51bGw7dGhpcy56Zj10aGlzLlZiPXRoaXMuRmc9dGhpcy5TZD10aGlzLlZjPXRoaXMuaGQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnZkPTA7dGhpcy5maD0hMTt0aGlzLmVoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy4kYixhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlpiLGFkdGFncmVnZXg6dGhpcy5mZCxiaXRyYXRlOnRoaXMuT2EsanNwb3B1cHM6dGhpcy5UZSxzaWRlbG9hZHM6dGhpcy50YixkaXNhYmxldGVzdHM6dGhpcy5HZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLlNlLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnBhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuWmQsSE9NQURfQkxPQ0tFRDp0aGlzLllkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsCnRlc3RUYWdzWEhSOnRoaXMuVWMsdGVzdDNQQ29va2llOnRoaXMub2MsdGhyb3R0bGU6dGhpcy5PZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLmljLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudmcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5zYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuaGQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuVmMsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuU2QsY29uZmlnRmFpbHVyZXM6dGhpcy5aYSxzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5yZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLnpmLHZtYXBzOnRoaXMuTmYsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHluOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy4kYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLmpiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuWmI9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5mZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkdnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuU2U9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuSmM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5wYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9CmIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLlpkPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuWWQ9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMudmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5XYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMub2M9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLk9kPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmljPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLnZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuaGQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmCih0aGlzLlZjPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuU2Q9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLlphPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5yZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuemY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmCih0aGlzLk5mPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuemM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmllPWIuYWRGYWxsYmFja1VSTCl9LFZsOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09dHlwZW9mIHRoaXMuWmFbYV0mJjE9PXRoaXMuWmFbYV0mJihiPSEwKTtyZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYil7dGhpcy5aYVtiXT0hMH0sRGw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxNZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9ZS5GayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fAp0aGlzLlpifHx0aGlzLmZkKSYmKGg9dGhpcy5IbShoKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkZsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sUWU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKTGM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuZ2EmJnRoaXMuZ2EubGVuZ3RoJiYwPHRoaXMuZ2EubGVuZ3RoJiYoYT10aGlzLmdhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFJlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuUWUoYik7cmV0dXJuIGF9LEZsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwOwpyZXR1cm4ibm9uZSJ9LHdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2FbdGhpcy5yZl19LFBjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy53ZCgpLGE9dGhpcy5UaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSx4aDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxHbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPApoLmxlbmd0aDtGKyspe3ZhciBrPWhbRl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy54aChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZiloLnB1c2gobCsiPSIrZltsXSk7Zj1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMueGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxIbTpmdW5jdGlvbihiKXt0aGlzLiRiJiYoYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5HbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sUms6ZnVuY3Rpb24oKXt0aGlzLnlhJiYKdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLk1rKHRoaXMueWEuY2xpZW50QVBJcyl9LE1rOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmYS5IbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuR24oYi5wbGF5ZXIpO2EuZigpfX0saTpmdW5jdGlvbihiLGEsZCxmLGMsZSl7bT10aGlzO3RoaXMuU2U9ITA7dGhpcy5KYz1iO3RoaXMucGE9YTt0aGlzLm5mPWQ7dGhpcy5VZD1mO3RoaXMuRGM9Yzt0aGlzLnlhPWV8fHt9O3RoaXMuUmsoKTt0aGlzLnhtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnBhKXRoaXMudm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSwKcmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LHhtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLkpjK3RoaXMub2UoImdsb2JhbCIpKSx0aGlzLlNsLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnRmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuQWMoKX0uYmluZCh0aGlzKSwhMCl9LHZtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLnBhK3RoaXMub2UoImNsaWVudCIsLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoKIj8iKSsoImNhY2hlPSIrdGhpcy5MYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGRhOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhkKXt0aGlzLmhkPSEwO3ZhciBhPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChnKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpOwpmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkRjPSExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWWQpKTsKdGhpcy5UYigpO2UuRmMoay5UbSk7KGE9ZS5DYih0aGlzLndkKCkpKXx8KGE9ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sU2w6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9aWYoIWEuZW5hYmxlZHx8IWEuZm9yY2VfZGlzYWJsZWQpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSwKdGhpcy5UYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnBhfWVsc2UgZD10aGlzLnBhO2lmKCEoZC5lbmFibGVkJiZkLnNlcnZlciYmZC5hbGlhcyYmZC5jb25maWcpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5nYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLkYoIndlYi5kZSIpfHxlLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8CmUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLkxjKCkpZm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5PYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuSmU9ZC5hZHBhdGh8fCIiO3RoaXMucmY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5UYigpKX0sTWM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEEodGhpcy5QYygpKSxkPXRoaXMudGEodGhpcy5PYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEEodGhpcy5PYit0aGlzLm9lKCJjdXN0b21lciIpKTt0aGlzLklhKGEsdGhpcy5hby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY3VzdG9tZXIiKTtiP3RoaXMuVGo/dGhpcy5kYSgibm9TVk1Db25maWciKToodGhpcy5Uaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGFvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuaWM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuVmM9dGhpcy5mYihkLnN0cmljdCk7dGhpcy5TZD10aGlzLmZiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkZnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy4kYT10aGlzLmZiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUGI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5SYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLlVjPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy5vYz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy4kYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlpiPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5mZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT0KZC5qc3BvcHVwc3x8ITE7dGhpcy50Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5WYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuVmI7dGhpcy56Zj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmpkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5OZj1kLnZtYXBzfHwiIjt0aGlzLnpjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmllPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLk9kPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuaWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmljPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMucG8oKSYmKHRoaXMuUGJ8fHRoaXMuUmJ8fHRoaXMuUWJ8fHRoaXMuVWMpP3RoaXMubmY/KHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuVGIoKSk6CnRoaXMuZm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GZigpKX19LGZvOmZ1bmN0aW9uKCl7dGhpcy5lbygpO3RoaXMuaG8oKX0saG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksCkY9ZS5YKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihGLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoRikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwplLnpiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUucWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxGZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuVGIoKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGIpKSx0aGlzLlRiKCksdGhpcy50ZSgpKX0sZW86ZnVuY3Rpb24oKXtpZih0aGlzLlBiKXt2YXIgYj1lLnFkKCk7aWYoKGIuaXNDaHJvbWV8fGIuaXNGaXJlZm94KSYmdGhpcy5tbSgpKXRoaXMuTmQodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUGIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5QYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwpiPWR9Y2F0Y2goZil7fWI/dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5jaSgpfX1lbHNlIHRoaXMuY2koKX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy5rbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuWmguYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWZ1bmN0aW9uIGEoKXt0aGlzLk5kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5RYj10aGlzLlVjKSYmdGhpcy5RYi5sZW5ndGgpe3ZhciBkPXRoaXMuUWIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5aaCgpfSxrbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IEEoYiksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLmJpLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBhKCl7dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlJiJiZ0aGlzLlJiLmxlbmd0aCl7dmFyIGQ9dGhpcy5SYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmJpKCl9LGxvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwKITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihhLGQpe2Q9PWImJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sWmg6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLnlkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMuZmIoYi5jYyk7dGhpcy5GZigpfS5iaW5kKHRoaXMpLHRoaXMuJGguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy4kaCgpfWVsc2UgdGhpcy5GZigpfSwKJGg6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKTt0aGlzLlRiKCk7dGhpcy50ZSgpfSxtbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChiKXtyZXR1cm4iZmFpbCJ9fSxUYjpmdW5jdGlvbigpe3ZhciBiPSIwIixhPSIwIjt0cnl7ZS5TYSgpJiYoYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQWIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlpkKSk7dGhpcy5VZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVkJiZ0aGlzLlVkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkFifSl9LApRazpmdW5jdGlvbigpe2lmKHRoaXMuU2QmJnRoaXMuVmwoKSl7dmFyIGI9dGhpcy5EbCgpO2ImJmIuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYi5qb2luKCJfIiksITApfX0sZ2k6ZnVuY3Rpb24oYil7Ynx8KGI9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGIpdHJ5e2I9Yi50b1N0cmluZygpfWNhdGNoKGEpe2I9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9Yj1iLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITApfSxJYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy52ZHx8KHRoaXMudmQ9MCk7dGhpcy52ZCsrO3RoaXMudmQ+dGhpcy5laCYmIXRoaXMuZmgmJih0aGlzLmZoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5laCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi51aT0hMCk7YyYmZS5rbSgpJiYoYi5QZz0hMCk7aCYmKGIuWWg9ITApO3JldHVybiBiLmxvYWQoKX0sTms6ZnVuY3Rpb24oKXtlLlNhKCl8fAplLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmRhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMudGEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5kYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sY286ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuTmZ9LE9rOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKITApO3ZhciBiPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2IuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYix0aGlzLkVvLmJpbmQodGhpcyksdGhpcy5Eby5iaW5kKHRoaXMpKX0sRW86ZnVuY3Rpb24oYil7dmFyIGE9bnVsbCxkPW51bGw7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLm1sKCl9LERvOmZ1bmN0aW9uKCl7fSxtbDpmdW5jdGlvbigpe2UuRmMoay5sbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sCnRlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMudGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy50Yi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLnRiW2JdOyJyZXF1ZXN0Ij09YS50eXBlJiZlLmFiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09YS50eXBlKXt2YXIgZD1uZXcgSDt3aW5kb3dbZC5mYSgpXT10aGlzO2UuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKGIpe2lmKGIucmVzcG9uc2VUZXh0KXRyeXtldmFsKGIucmVzcG9uc2VUZXh0KX1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0scG86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5PZH0sTGI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0KIiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9LHpiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsYyxlLGgsayxsPTA7bDxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQobCsrKSxmPWIuY2hhckNvZGVBdChsKyspLGM9Yi5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxoPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBhfSx0YTpmdW5jdGlvbihhKXt2YXIgZz0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtnW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZ1sxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSxUaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBnKGEpe3ZhciBiPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9YT4+PjQqZCYxNSxiKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspaFtjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWhbY109ZChoW2MtM11eaFtjLThdXmhbYy0xNF1eaFtjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditoW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditoW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGcoaykrZyhsKStnKG0pK2cocikrZyh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLG09bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuYXA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLmFwfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmJiPWEuYy5SKCk6dGhpcy5iYj0iIjthLmMubWgmJmEuYy5taCh7cGF1c2U6dGhpcy5CZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlFoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmFmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMud28uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5rYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmVjPXRoaXMuZ2Q9ITE7dGhpcy5Daz0xRTM7dGhpcy5yYT1udWxsO3RoaXMuQj1nO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLktkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLkdrPWUuWCgxMCk7CnRoaXMuQmY9MDt0aGlzLmRkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZGQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZGQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQWs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5lZj10aGlzLkpkPSExO3RoaXMudmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLm5lPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5qYz0hMTt0aGlzLiRrPWUuWCgxMCk7dGhpcy5LYj1lLlgoMTApO3RoaXMuSWI9ZS5YKDEwKTt0aGlzLlVoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuVmQ9CnRoaXMuVWI9dGhpcy52ZT10aGlzLm5kPXRoaXMuTGQ9dGhpcy51Yj10aGlzLnFjPXRoaXMuRGg9dGhpcy5zZD10aGlzLnFvPXRoaXMueGI9dGhpcy5KYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5SbT0yMDA7dGhpcy5RZj10aGlzLldjPXRoaXMucmU9dGhpcy5QZj10aGlzLm1mPSExO3RoaXMuY2Y9e319Yy5haj1hO2EucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBnfSxoaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5HYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuVW4oKTtlLm8oay5yayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXZTpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLnhiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkIuUyl0aGlzLkJmKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5CLlFrKCksYz1tLmdldENvbmZpZygpLGUueGUmJih0aGlzLkIueW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQi5IYSYmdGhpcy5CLmlzRW5hYmxlZD8odGhpcy5oaSgpLG5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQi5WYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLmhpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5CLlZiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBrPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2suV2UoYSxnLGQpfSw1MCl9fSxoZjpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuVmQ9dGhpcy5VYj10aGlzLnNkPSExO3RoaXMuYj1hO3RoaXMuTm4odGhpcy5iKTt0aGlzLmFoKGEpO3RoaXMudmM9dGhpcy5SZyhhKTt0aGlzLlZrKCl9LGFoOmZ1bmN0aW9uKGIpe2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mCmEmJih0aGlzLktkPXRoaXMuT2woYikpLHRoaXMuYWgoYi5wYXJlbnQpKX0sUmc6ZnVuY3Rpb24oYil7dmFyIGM9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoYz10aGlzLlJnKGIucGFyZW50KSksYy5wdXNoKHRoaXMueGwoYikpKTtyZXR1cm4gY30seGw6ZnVuY3Rpb24oYSl7dmFyIGM9IiIsZD1bXTtpZihhJiZhLkomJmEuSi5nZXRBdHRyaWJ1dGUpe2M9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylkLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpjLGNyZWF0aXZlSUQ6ZH19LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5KKXtjPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpOwpmPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKylkLnB1c2goYS5sYihjW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmh9fSxxYTpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGM9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJgooYz1hLmVycm9yLmRldGFpbC5jb2RlKSxhLnBkJiZhLnBkLmVycm9yJiZhLnBkLmVycm9yLmNvZGUmJihjPWEucGQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5ZYy5jb2RlOmM9PUQuY2UuY29kZT9lLm8oay5abyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOihlLlhlKCksYz09RC5VZi5jb2RlJiZlLm8oay5MbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKTtlLm8oay5rbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVm4oKTt0aGlzLlVhKCJlbXB0eSIpO3RoaXMuQi5BYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkFiLCEwKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Gbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LlZmLmNvZGU6ZS5vKGsuJG8sCnRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUubyhrLk1tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUubyhrLkJvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUubyhrLkNvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuVWEoInVua25vd24iKX10aGlzLmZjKGEpO3RoaXMuUGEoKX0sZmM6ZnVuY3Rpb24oYSl7dmFyIGM9CjkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihjPWEuZXJyb3IuY29kZSw5MDE8YyYmKGM9OTAwKSk7Zm9yKGM9eyJbRVJST1JDT0RFXSI6Y307YS5NYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk1hLnBvcCgpO3RoaXMuVmUoZC51cmwsZC50eXBlLGMpfWNhdGNoKGYpe319LE5uOmZ1bmN0aW9uKGEpe3RoaXMudmU9ITE7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dmFyIGM9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYz10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuZ2IuekluZGV4PWM7Yz10aGlzLmEuQTt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksZj0iIjtkJiZkLmVudnZhcnMmJihmPWQuZW52dmFycygpKTtmLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLmdldEVudmlyb25tZW50VmFyaWFibGVzJiYoZj1kLmdldEVudmlyb25tZW50VmFyaWFibGVzKCkpOwpmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5tZj0hMCl9Y2F0Y2goaCl7fWMuY3E9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGMuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihjLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZjLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLkFrJiZ0aGlzLnBsYXllci5DZSgpJiYoYy52b2x1bWU9dGhpcy5wbGF5ZXIuQ2UoKS8xMDApO2Zvcig7Yy5maXJzdENoaWxkOyljLnJlbW92ZUNoaWxkKGMuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPAphLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy52ayhjLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMubWYmJmMubG9hZCgpO2lmKHRoaXMuZGkoYykpe3RoaXMuVmgoInNldHVwIix0aGlzLldhKCkpO3RoaXMueWsoYyk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLm1mP3RoaXMudmlkZW89Yzp0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyl9Y2F0Y2gobCl7dGhpcy52aWRlbz1jfX1lbHNlIHRoaXMuYi5XaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChjKSx0aGlzLkxuKCkpOnRoaXMuYi5vcmlnaW4uSGcody4kZCl9LExuOmZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnViPXRoaXMucWM9ITE7dGhpcy5hLmMuc2EmJnRoaXMuYS5jLnNhKCkmJihlLm8oay55Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudWI9ITApO2UudWUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4ubWEmJmUuemsodGhpcy5iLm9yaWdpbi5tYSk7dGhpcy5WaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS5FaCgpO3RoaXMuYS55ZigpO2ZvcihhPQp0aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5hLnlmKCk7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy5yYT10aGlzLmEuSTt0aGlzLm5pKCJ2cGFpZCIpO2lmKHRoaXMudWIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5OYigibXV0ZWQiLCJjb250ZW50Iik7ZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX10aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsCiJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5hLkkuYXBwZW5kQ2hpbGQodGhpcy5DKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUueGYodGhpcy5DLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5DLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLlJsKCksYz10aGlzLmIudS5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsCiJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLm1nKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5CKTt0aGlzLkMuc3JjPWE7ZS5wZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEuaGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ObyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLk9vKCksdGhpcy5hLmhjKCEwKSwhdGhpcy5VYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy5DLApjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmhjKCEwKSx0aGlzLlNvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5XbygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhvKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlRvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5kYyk7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goYyl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLmxlLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuUG8oKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5XYyYmKHRoaXMuUWY9ITEsdGhpcy5uYygpKSx0aGlzLlFvKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLk5iKCJtdXRlZCIsInVzZXIiKSxlLm8oay56ZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSGYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLnBlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe2UuaWEodGhpcy5DLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sUG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLmplLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnFjPSEwfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmJkLHRoaXMuYi51LAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMucWM9ITF9LFNvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sUm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sT286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5XaCgpO2UubyhrLmJnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2UubyhrLmJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuc2Q9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLlpmLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5WYSgibWlkcG9pbnQiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsuaGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLktmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sc2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5DJiZ0aGlzLkMucGFyZW50Tm9kZSYmdGhpcy5DLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGM9dGhpcy5DLnBhcmVudE5vZGU7dGhpcy5DLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DKTtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyk7CmUudWUoKTt0aGlzLkM9ITE7dGhpcy5QYShhKX19LE5vOmZ1bmN0aW9uKGEpe3ZhciBjPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWMmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGM9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGMubWF0Y2goZCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLm8oay5Zbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuc2koITApfSx2azpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkhhJiZiLmlzRW5hYmxlZCYmIWIuTGMoKSl7dmFyIGM9Yi50YShhKTtyZXR1cm4gYy5wcm90b2NvbCsiOi8vIitjLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9ZChjLHRoaXMuQik7Zi5vbmVycm9yPXRoaXMuS28uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoYyx0aGlzLkIpKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LHlrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm9pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMub2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5NZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sb2k6ZnVuY3Rpb24oYSl7dGhpcy5lY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjfHx0aGlzLk1mKGEpfS5iaW5kKHRoaXMpLHRoaXMuQ2spKX0sTWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2QmJnRoaXMuZGkodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5lYyl7dGhpcy5nZD0hMDt0cnl7aWYoIWUuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRmQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5XYSgpLCEwKSx0aGlzLkIuRmd8fHRoaXMuQi5kYSgidmlkZW8tbm9vcCIpKTt0aGlzLlBhKCk7cmV0dXJufX1jYXRjaChjKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5XYSgpLCEwKX10aGlzLkhvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEueWYoKTt0aGlzLkdvKCk7dGhpcy5uaSgpO3RoaXMubmcoKTt0aGlzLmEuRWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuQ2YoKX19LENmOmZ1bmN0aW9uKCl7dGhpcy5uZHx8dGhpcy4kZigpfSwkZjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZpZGVvLnBsYXkoKTtpZihjJiZjWyJjYXRjaCJdKWNbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLm5kfHwoYT90aGlzLlBhKCk6KHRoaXMuYWYoITApLHRoaXMuJGYoITApKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYy5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfS5iaW5kKHRoaXMpO3RoaXMuRWUoKS5TaCh0aGlzKX0sS2Y6ZnVuY3Rpb24oKXt0aGlzLkIuJGEmJiF0aGlzLkpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5vKGsucGssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlBhKCl9LHNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkPSExLGY9MDtmPGEubGVuZ3RoO2YrKylkPWUuV2coYVtmXSksYy5wdXNoKGQpO2E9e2hhc2hlczpjfTthPWsuUmEoYSx0aGlzLnMoKSk7ZS5TbihhKX0sUGE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuV2QmJnRoaXMuc2sodGhpcy5iLldkKTsKaWYoIXRoaXMudmUpaWYodGhpcy52ZT0hMCx0aGlzLlZkfHwoZS5vKGsuT20sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmIud2J8fHRoaXMuYi50Yyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5CZisrO3RoaXMuZWM9dGhpcy5nZD0hMTt0cnl7dGhpcy5GZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMucmEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSmQ9ITE7dHJ5e3RoaXMuYS5saSgpfWNhdGNoKGgpe310aGlzLkxkPSEwO3RoaXMuYS5JZSgpO3RoaXMuamM9ITE7dGhpcy5FZSgpLk9oKCk7dGhpcy5iLndiJiZ0aGlzLmIub3JpZ2luLmJmKCk7dGhpcy5iLnRjJiYoYT90aGlzLmIub3JpZ2luLnloKCk6dGhpcy53ZSgpKX1lbHNlIHRoaXMud2UoKX0sCktvOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRmQodGhpcy52aWRlbyksdGhpcy5MZihhKSl9LExmOmZ1bmN0aW9uKGEpe3RoaXMuZWM9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5CLk5rKCk7dGhpcy5iLm9yaWdpbi5IZyh3LiRkKX0scGk6ZnVuY3Rpb24oKXtpZih0aGlzLnFvKXRoaXMuUGEoKTtlbHNle3RoaXMuamM9ITA7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMudW8oYSk7aWYoIXRoaXMuVWIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpjLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9ZD0iIjt0aGlzLmIuQWYmJihjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVWgpKSYmKGQ9dGhpcy5iLkFmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5KZHx8KHRoaXMuSmQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLmIud2I/KHRoaXMuZWM9dGhpcy5nZD0hMSx0aGlzLkZkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSmQ9ITEsdGhpcy5hLmxpKCksdGhpcy5iLm9yaWdpbi5iZigpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLm5lPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saWk6ZnVuY3Rpb24oKXt0aGlzLkRofHwodGhpcy5EaD0hMCx0aGlzLnNkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sdW86ZnVuY3Rpb24oYSl7ZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthPT10aGlzLmppfHx0aGlzLkpifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fAp0aGlzLldoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkIuJGEmJnRoaXMuVmEoInN0YXJ0IiksZS5vKGsuYmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSxlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnNkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS5vKGsuWmYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUubyhrLmhnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLHRoaXMuamk9YSl9LFZoOmZ1bmN0aW9uKGEsYyl7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGMsITApfSxVbjpmdW5jdGlvbigpe2UuUWQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sV2g6ZnVuY3Rpb24oKXtlLlFkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFZuOmZ1bmN0aW9uKCl7ZS5RZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlFkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFZhOmZ1bmN0aW9uKGEpeyh0aGlzLlBmfHx0aGlzLkIuJGEpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5XYSgpLCEwKX0sTmI6ZnVuY3Rpb24oYSxjKXt0aGlzLkIuJGEmJmUudHJhY2soInN0YXRzX2hkXyIrYSxjLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxjKXtpZighdGhpcy5KYil7dGhpcy5jZiYmdGhpcy5jZi50cmFjayYmdGhpcy5jZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmUueGUmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPQohMH12YXIgZD1bXTt0cnl7ZD10aGlzLlBsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMucmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5LZC5pbXByZXNzaW9ucyYmZS5pbShoLnVybCx0aGlzLktkLmltcHJlc3Npb25zKT90aGlzLlZlKGgudXJsLGgudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLm8oay5xayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCkse2FkSWQ6dGhpcy5LZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5zKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuVmUoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWMpdHJ5e3RoaXMuYi5NYT10aGlzLmNsKHRoaXMuYi5NYSxhKX1jYXRjaChtKXt9fX0sV2E6ZnVuY3Rpb24oKXt2YXIgYT1lLlNhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLApjPSIiO3RoaXMuUGYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFZlOmZ1bmN0aW9uKGEsYyxkLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGM9dGhpcy5CLnZhKGEpLGQmJmMudWsoZCksZnx8KGY9dGhpcy5FZyksZXx8KGU9dGhpcy5FZyksdGhpcy53ayhhKSx0aGlzLkIuSWEoYyxmdW5jdGlvbigpe3RoaXMuTmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sd2s6ZnVuY3Rpb24oYSl7dGhpcy5sY1thXT0ib3BlbiJ9LE5oOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09ImNsb3NlZCJ9LFZrOmZ1bmN0aW9uKCl7dGhpcy5sYz17fX0sWG46ZnVuY3Rpb24oKXt2YXIgYT0wLGM7Zm9yKGMgaW4gdGhpcy5sYyl0aGlzLmxjLmhhc093blByb3BlcnR5KGMpJiYib3BlbiI9PXRoaXMubGNbY10mJmErKztyZXR1cm4gYX0sUGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09CmN9KX0sY2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWN9KX0sSG86ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLklvLmJpbmQodGhpcykpfSxJbzpmdW5jdGlvbigpe2UuU2EoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMubmMoKTp0aGlzLmIuZGMmJihlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt0cnl7dmFyIGM9d2luZG93Lm9wZW4oIiIsYSk7Yy5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZj0KdGhpcy5iLmRjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5kYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LEdvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0KImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5CLmpkJiYoYz10aGlzLkIuamQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGIuYmluZCh0aGlzKSwxRTMqYyk7dGhpcy5jYXB0aW9uPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSl9fSxEYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxIZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oYSl7aWYoIWUuRGYodGhpcy5jb250cm9scykpe3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy4kazt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5LYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5laS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGguc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixoLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuSWI7aC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9oLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnNvLmJpbmQodGhpcykpOmguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucm8uYmluZCh0aGlzKSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSGQoKX0uYmluZCh0aGlzKSk7CmguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuQWYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuU2EoKXx8KHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkhkKCl9LmJpbmQodGhpcykpLHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChkKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsCmMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMueGEmJih0aGlzLnhhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApjLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsueWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLmFmKCkpO3RoaXMuRWIoKX19LEViOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbmM6ZnVuY3Rpb24oKXsiaGlkZGVuIj09dGhpcy5jb250cm9scy5zdHlsZS52aXNpYmlsaXR5fHx0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuUWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkPwoodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSl9LGZpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5xYz8oZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMucWM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZHx8KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWQmJih0aGlzLmEuQS5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsCiEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0scm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZD8odGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5OYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy51Yj8oZS5pYSh0aGlzLkMsCiJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJtdXRlIiksdGhpcy51Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxhZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkfHwodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHdvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQmJih0aGlzLmEuQS5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksdGhpcy5OYigidW5tdXRlZCIsImNvbnRlbnQiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sbWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMpO3RoaXMubmR8fHRoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMucm0oKSYmdGhpcy5xbSgpJiYodGhpcy5CLnNjfHwic3BpZWdlbC5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYicHJlcm9sbCI9PWUuR2ImJnRoaXMudm8oKXx8KHRoaXMubmQ9ITAsdGhpcy54YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54YiksdGhpcy54Yj0hMSksdGhpcy56ZygpKX0scm06ZnVuY3Rpb24oKXt2YXIgYT0KZS5xZCgpO3JldHVybiB0aGlzLkIuVmImJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0scW06ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciIT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5lZnx8KGE9ITAsYy5hZEZhbGxiYWNrVVJMfHwoYy5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3JldHVybihhfHwhdGhpcy5yZSYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuZWZ9LEVsOmZ1bmN0aW9uKCl7dmFyIGE9bS5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpO3JldHVybiBhfSx2bzpmdW5jdGlvbigpe20uZ2V0Q29uZmlnKCk7CnRoaXMuZWY9dGhpcy5XYz10aGlzLlFmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLldhKCksITApO3RoaXMucmU9ITA7dmFyIGE9dGhpcy5FbCgpLGE9ZS5tZyhhLHRoaXMuQiwhMSx7b25seVVSTDohMH0pO2lmKCFhKXJldHVybiExO3RoaXMuV2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtyZXR1cm4hMH0semc6ZnVuY3Rpb24oYSl7dGhpcy5YbigpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemcoITApfS5iaW5kKHRoaXMpLHRoaXMuUm0pOih0aGlzLkxkPSEwLHRoaXMuYS5JZSgpLHRoaXMuYS51bigpLHRoaXMuamM9ITEsZS5vKGsuWmssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLkVlKCkuT2goKSl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYSgibWluVmlzIik7CmEmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5RaCgpOnRoaXMuQmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5kYyxhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi53Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnZjJiYwPHRoaXMudmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnZjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLkdrKyItIit0aGlzLkJmO3RoaXMuYiYmdGhpcy5iLlhnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPQp0aGlzLmIuWGcoKSk7cmV0dXJuIGF9LEVnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5hanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5DbXx8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5sYT1udWxsO3RoaXMuVj1bXTt0aGlzLko9bnVsbDt0aGlzLnVjPXRoaXMud2M9ITE7dGhpcy5tYT0iIjt0aGlzLk9mPSExO3RoaXMuaGg9IiI7ZCYmZC5lbXB0eT90aGlzLkFtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfQp2YXIgYj0wLGcsZD1bXTtjLmFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnFkKCksYjtiPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOm0udmEobS5NZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGUuRigibWFydGhhc3Rld2FydC5jb20iKXx8ZS5GKCJmYW5kb20uY29tIil8fGUuRigiZ2lnYS5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCkpe3ZhciBoPWUuQmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPT09CmguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihkKCl8fGcoKXx8aygpfHwiYXBwc3BvdCI9PWMpbCgpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uTWQoaCkpKyImdHlwZT1qcyIsYj1tLnZhKG0uTWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGUudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPW0udmEobS5NZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy56bS5iaW5kKHRoaXMpLHRoaXMud20uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLmxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5HYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuR2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkdifHx0aGlzLm9tKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLmNvKCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7CnZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09Zy5maXJzdENoaWxkO2MucHVzaChnKX1jYXRjaChoKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9tOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sCmM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sem06ZnVuY3Rpb24oYSl7dGhpcy5jbihhKTt0cnl7dGhpcy5sYT1hLnJlc3BvbnNlWE1MLHRoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj0KdGhpcy5TZygpO3RoaXMud2M9dGhpcy5FZigpO3RoaXMudWM9dGhpcy5haSgpO3RoaXMuaGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLk9jKCk7ZWxzZXt0aGlzLnFhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5PZj9ELmNlOkQuVGZ9KSk7dHJ5e2UudHJhY2soInN0YXRzX2hkX210eXVybCIsZS5DYih0aGlzLm1hKSwhMCl9Y2F0Y2goYyl7fX19LEFtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj10aGlzLlNnKCk7dGhpcy53Yz10aGlzLkVmKCk7dGhpcy51Yz10aGlzLmFpKCk7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuT2Y/RC5jZTpELlRmfSkpfSx3bTpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5RYSh3LlNmLHtkZXB0aDpifSkpfSwKT2M6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy5zbSgpP3RoaXMubW8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5iaCgpLGcse0FkU3lzdGVtOnRoaXMud2woKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlFhKHcuVmYpKTooYj0wLHRoaXMuem8oKSYmdGhpcy5oZih0aGlzLmJsKCkpKX0sYmY6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LmJmKCl9LHloOmZ1bmN0aW9uKCl7dGhpcy51Yz8odGhpcy51Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC55aCgpfSx6bzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpvKCk/dGhpcy5pbygpPyEwOigtMSE9dGhpcy5HYygpP3RoaXMucWEodGhpcy5RYSh3LlhkKSk6dGhpcy5xYSh0aGlzLlFhKHcuUmYpKSwhMSk6KHRoaXMucWEodGhpcy5RYSh3LlljLApELlVmKSksITEpfSxoZjpmdW5jdGlvbihhKXt0aGlzLm1hfHwodGhpcy5tYT0iIik7YS5XZHx8KGEuV2Q9W10pO2EuV2QucHVzaCh0aGlzLmhoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuWWUoKSk7YS53Yj1hLndiP2Eud2I6dGhpcy53YzthLnRjPWEudGM/YS50Yzp0aGlzLnVjO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZzt0aGlzLnBhcmVudC5oZihhKX0sYmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgUmE7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuZHVyYXRpb249dGhpcy5HYygpO2EuTT10aGlzLlpnKCk7YS5kYz10aGlzLnpsKCk7YS5rcT1bXTthLm9yaWdpbj10aGlzO2EudT10aGlzLnZsKCk7YS5BZj10aGlzLk5sKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8Cih0aGlzLm1hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuT2c7aWYoIXRoaXMuSiYmdGhpcy5sYSYmdGhpcy5sYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLmxhO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGM9ITE7KGM9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmYy5sZW5ndGgmJmUudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuTWE9YS5lcnJvci5jb2RlIT13LlhkLmNvZGU/YS5NYS5jb25jYXQodGhpcy5BbCgpKTphLk1hLmNvbmNhdCh0aGlzLkpsKCkpKTt0aGlzLlYubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYyYmdGhpcy5wYXJlbnQuZmMoYSksYj0wLHRoaXMuT2MoKSk6Cih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5xYSYmdGhpcy5wYXJlbnQucWEoYSksYj0wKX0sZmM6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZmMoYSl9LEhnOmZ1bmN0aW9uKGEsYil7dGhpcy5xYSh0aGlzLlFhKGEsYikpfSxRYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBTYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIGI8Z30sam86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlpnKCkubGVuZ3RofSxpbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuR2MoKX0sRWY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlYuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxhaTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuViYmMjw9dGhpcy5WLmxlbmd0aCYmCiF0aGlzLkVmKCkmJihhPSEwKTtyZXR1cm4gYX0sY246ZnVuY3Rpb24oYSl7dGhpcy5tYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm1hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubWE9IlVOS05PV04ifXRyeXt0aGlzLk9mPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSx3bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sWWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMub2goYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLm9oKGEucGFyZW50Tm9kZSk6ITF9LEpsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEFsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx6bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxPYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksRXA6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuT2F8fDFFMzt0cnl7dmFyIGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksYj1nLmNvbmNhdChlKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMudWQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sTmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5SbihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LERlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sR2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMudWQoYSk6IiJ9LHVkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLkdlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ha3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmxqfHxUYTtuZXcgVGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk1hPVtdO3RoaXMuTT1bXTt0aGlzLmRjPSIiO3RoaXMudT10aGlzLnRjPXRoaXMud2I9ITE7dGhpcy5LZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuTGU9IiJ9Yy5Kaj1hO2EucHJvdG90eXBlPXtXazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxIbDpmdW5jdGlvbigpe2lmKCF0aGlzLktlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubGEpe3ZhciBhPXRoaXMub3JpZ2luLmxhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGM9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1jLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLktlPWFbZF0pfXJldHVybiB0aGlzLktlfSxYZzpmdW5jdGlvbigpe2lmKHRoaXMuTGUpcmV0dXJuIHRoaXMuTGU7dmFyIGE9IiI7KGE9dGhpcy5IbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuTGU9YX0sUmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bY107cmV0dXJuIGF9fX0pKGMpO3ZhciBSYT1jLkpqfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkxpfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e2VlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLExhOiJYTUxfUEFSU0VfRVJST1IifSxSZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTGE6IkRVUkFUSU9OX0VSUk9SIn0sWWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLExhOiJFTVBUWV9WQVNUIn0sVmY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkxhOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxTZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixMYToiTE9BRF9FUlJPUiJ9LCRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixMYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LAplcDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixMYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTGE6IkRVTU1ZX0FEIn19LEQ9e1RmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTGE6Ik5PX0FEUyJ9LFVmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixMYToiTk9fTUVESUFGSUxFUyJ9LGZwOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLExhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sY2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlvPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFZhPWMueW98fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5lcnJvcj1hO3RoaXMucGQ9Yzt0aGlzLk1hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFNhPWMuT2l8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMuTml8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5QaD1hO3RoaXMudmlkZW89Yzt0aGlzLlRkPVtdO3RoaXMuTWg9W107dGhpcy5kZj1bXTt0aGlzLkpvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSygpfWMuZ3A9YTthLnByb3RvdHlwZT17SzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5QaC5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLlBoW2FdLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suWnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmhuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5UZC5wdXNoKHtzcmM6ZCxmcmFtZTpoLFNtOmUsdmVuZG9yOmMuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7Yzx0aGlzLmRmLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuZGZbY107ZC50eXBlPT09YSYmZC5Jayh0aGlzLkJsKGEpKX19LApCbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpcTohMCxocTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntWcDoidmlkZW8iLGxxOiJqc0N1c3RvbSIsbXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxucToxLEZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sClFsOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5UZC5sZW5ndGg7YysrKWlmKHRoaXMuVGRbY10udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5UZFtjXS5TbTtyZXR1cm4iIn0scm46ZnVuY3Rpb24oYSxjKXt0aGlzLk1oLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlFsKGMpLHZlbmRvcjpjfSk7dGhpcy5UbigpfSxobjpmdW5jdGlvbihhLGMpeyJ2aWRlbyI9PT1hP3RoaXMuSm8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMua2coYSxjKX0uYmluZCh0aGlzKSk6dGhpcy5rZyhhLGMpfSxrZzpmdW5jdGlvbihhLGMpe3RoaXMuZGYucHVzaCh7dHlwZTphLElrOmMsZnE6ITF9KX0sVG46ZnVuY3Rpb24oKXt0aGlzLk1oLm1hcChmdW5jdGlvbihhKXthLmxtfHwoYS5ZcCh7YWRTZXNzaW9uSWQ6ZS5YKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5qcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmxtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMudG18fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMua2I9YS5UZygpO3RoaXMuST1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkkuaWQ9ZS5YKDEwKTt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5OYT17fTt0aGlzLmxnPSExOwp0aGlzLmFjPVtdfWMuS2k9YTthLnByb3RvdHlwZT17dWw6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxlPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGU9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6ZSx5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy51bChhKTtmb3IodmFyIGM9MCxkPTAsZT0hMSxoPXRoaXMuWmwoYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMH0sbGk6ZnVuY3Rpb24oKXt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEVoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5jLmwoKSl9LHVuOmZ1bmN0aW9uKCl7dGhpcy5sZ3x8Cih0aGlzLmMucGxheSgpLGUubyhrLm1kLHRoaXMuYy5sKCkpKX0seWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSS5zdHlsZS56SW5kZXg9YTt0aGlzLkkuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5JLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkkuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkkuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTsKdGhpcy5jLlJjJiZ0aGlzLmMuUmMoKT90aGlzLmMuVGcoKS5hcHBlbmRDaGlsZCh0aGlzLkkpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5JKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxabDpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gZH0sc2w6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTtjLnBvc2l0aW9uP2MucG9zaXRpb249Yy5wb3NpdGlvbjpjLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy53aWR0aD1hLm9mZnNldFdpZHRoO2MuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gY30saGM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zbCh0aGlzLmtiKTtpZihjLnghPXRoaXMuTmEueHx8Yy55IT10aGlzLk5hLnl8fGMucG9zaXRpb24hPXRoaXMuTmEucG9zaXRpb258fGMud2lkdGghPXRoaXMuTmEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLk5hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk5hLndpZHRoJiYwPHRoaXMuTmEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5JZSgpO3JldHVybn10aGlzLk5hPWM7dGhpcy5jLlJjKCk/KHRoaXMuSS5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSS5zdHlsZS50b3A9IjBweCIpOih0aGlzLkkuc3R5bGUubGVmdD1jLngrInB4Iix0aGlzLkkuc3R5bGUudG9wPWMueSsicHgiKTt0aGlzLkkuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9Yy5oZWlnaHQrInB4Ijt0aGlzLkkuc3R5bGUucG9zaXRpb249Yy5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuYWMubGVuZ3RoO2ErKyl0aGlzLmFjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWUuRGYodGhpcy5JKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5hY3x8KHRoaXMuYWM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmFjLnB1c2goYSl9LEllOmZ1bmN0aW9uKCl7dGhpcy5JJiZ0aGlzLkkucGFyZW50Tm9kZSYmdGhpcy5JLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSSk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuS2l8fFlhLEI9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPQplLlgoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgJGE9Yy5UaXx8JGE7bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5HZChhKTt0aGlzLkNnKCl9LEdkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYWI9Yy5Eanx8YWI7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWNhKCk7dGhpcy5ZYj10aGlzLllifHwhMTt0aGlzLmNnPXRoaXMuZWc9CnRoaXMubGg9dGhpcy51YT10aGlzLkdmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLkdmPSEwO3RoaXMubGgmJnRoaXMudWcoKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmpjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMua2QoKTt0aGlzLmxoPSEwO3RoaXMudWcoKX0uYmluZCh0aGlzKSk7CnRoaXMucGcoKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5ZYil7dGhpcy5rZCgpO2lmKCF0aGlzLkdmJiYhdGhpcy5rZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuR2YmJnRoaXMuY2cmJiF0aGlzLmVnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LCRnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGIubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1iLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YSlyZXR1cm4gZC5pbnN0YW5jZX19LHBnOmZ1bmN0aW9uKCl7aWYodGhpcy5rZCgpKXt2YXIgYT0KdGhpcy4kZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLmVnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuY2c9YS5DcH10aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLlRwKCk6ITF9LEdjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5HYygpOi0xfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxxbDpmdW5jdGlvbihhLGIpe3RoaXMuWWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuWWJ8fDMwMj09dGhpcy5ZYj90aGlzLnVhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5ZYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksMTAwKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE/KHRoaXMudygpLHRoaXMub2EoKSk6YS5NZSgpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLktsKGEpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuQ2p8fGJiOyhmdW5jdGlvbihjKXtjLkVqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbm06ZnVuY3Rpb24oKXt3aW5kb3cuT08uTmoubmsubGs/d2luZG93Lk9PLk5qLm5rLmxrLkFwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWNhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkZlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBhYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgYmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIGNiPWMuRWp8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMub289YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBlYj1jLm9vfHxlYjtuZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLkhoKCl9LEhoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5VJiYoMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcyksMTAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0scmc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmcoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMucmcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5yZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuRWl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sS2g6ZnVuY3Rpb24oYSl7YT1uZXcgZmIoYSk7YS5qYT90aGlzLlAoKTp0aGlzLkwoYSl8fChhLkdkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk4oYSksKG5ldyBnYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLnJsfHwodGhpcy5ybD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuS2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLktoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGhiPWMuR2l8fGhiLFM9bmV3IGhiKHIpO1MuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGliPWMuaGx8fGliO25ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFQ9Yy5Xanx8VDsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LmNkKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguY2QoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5QbShhKX0uYmluZCh0aGlzKSk7eC5jZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKTt4LmNkKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5VbCgpfSxQbTpmdW5jdGlvbihhKXt2YXIgYj0iIixjO2ZvcihjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7Yj1pc05hTihhW2NdKT8hMTphW2NdO2lmKDEwMDk9PWFbY118fDEwMDE9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKXt0aGlzLncoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2NdKWlmKGFbY10uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbY11bZF0pPyExOmFbY11bZF0sMTAwOT09YVtjXVtkXXx8CjEwMDE9PWFbY11bZF18fDMwMz09YVtjXVtkXXx8NDAzPT1hW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkQoKX19KX0pKGMpO3ZhciBVPWMuVmp8fFU7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO3RoaXMuQWQmJihhPWUuZGwoYSx0aGlzLkFkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFQoZCk7aWYoIXRoaXMuTChkKSl7dGhpcy5OKGQpOwp2YXIgZj1uZXcgVShkLHRoaXMuRyk7Zi5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuQWR8fCh0aGlzLkFkPVtdKSx0aGlzLkFkLnB1c2goYVtiXSksZD1uZXcgVChoKSx0aGlzLkwoZCl8fCh0aGlzLk4oZCksZj1uZXcgVShkLHRoaXMuRyksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxjZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGMpfSxubzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLk5jfHwKKHRoaXMuTmM9W10pLHRoaXMuTmMucHVzaChhKSx0aGlzLnRuKCkmJih0aGlzLnBmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bY10mJjA8dGhpcy5hYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmFhW2JdW2NdLmxlbmd0aDtkKyspdGhpcy5hYVtiXVtjXVtkXShhKX19LFVsOmZ1bmN0aW9uKCl7aWYodGhpcy5OYylmb3IodmFyIGE9MDthPHRoaXMuTmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5OY1thXSxjPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbY11bZF0mJjA8dGhpcy5hYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmFhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5hYVtjXVtkXVtlXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4Lm5vKGEpfX0pfSkoYyk7dmFyIGpiPWMuWGp8fGpiLHg9bmV3IGpiKHIpO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2I9Yy5ibnx8a2I7bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sd2E6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBsYj1jLkJpfHxsYjsoZnVuY3Rpb24oYyl7Yy5DaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkQoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbWI9Yy5DaXx8Cm1iOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbGIoZCk7dGhpcy5MKGgpfHwodGhpcy5OKGgpLChuZXcgbWIoaCx0aGlzLkcpKS5mKCkpfWNhdGNoKGspe319dGhpcy5QKCl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihiPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYj1jLk1pfHxwYjtuZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLndnPXRoaXMuRWM9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dmFyIGI9dGhpcy5KZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuRWM9Yik7aWYoIXRoaXMud2cmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fAphLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixhLnNvdXJjZS5DSE9PU0VSX0FCfHwiIiwhMCk7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixjLCEwKTt0aGlzLndnPSEwfX19Y2F0Y2goaCl7fX0uYmluZCh0aGlzKSk7dGhpcy5WZygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuZ24odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSxWZzpmdW5jdGlvbigpe2lmKHRoaXMuRWMpcmV0dXJuIHRoaXMuRWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuSmcoYSkpcmV0dXJuIHRoaXMuRWM9CmF9fSxKZzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiZhLnZpZGVvU2xvdCYmKGI9YSk7YSYmYS5oZHZwYWlkJiYoYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZ246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiYKdGhpcy5lYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5tdXRlJiZ0aGlzLmVhLm11dGUoKX0uYmluZCh0aGlzKSk7YSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sbWg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy55anx8cWI7KGZ1bmN0aW9uKGMpe2MueGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLnRpJiYodGhpcy5nKCksdGhpcy50aT0hMCx0aGlzLmthKCkpOwpiLkdhKCkuYWRkRXZlbnRMaXN0ZW5lcihhLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuVmcoKT90aGlzLkQoKToodGhpcy55ZXx8KHRoaXMueWU9MSksdGhpcy55ZSsrLDEwMDx0aGlzLnllP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy54anx8cmI7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLkwoYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTsKdmFyIHNiPWMuemp8fHNiLFY9bmV3IHNiKHIpO1YuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5RbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRiPWMuUW18fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5VPygwLHRoaXMuVSkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZmt8fHViOyhmdW5jdGlvbihjKXtjLmVrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEljOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSwKYT1hLmdldFJhd1BsYXllcigpO3JldHVybiBhLmltYUFkc0xvYWRlcn0sZW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMub2EoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMuZ2V0UGxheWVyKCk7CnRoaXMuQmE/dGhpcy5lbih0aGlzLkJhKToodGhpcy5CYT10aGlzLkljKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuRCgpO3JldHVybn1pZighdGhpcy54Yyl7dGhpcy5EKCk7cmV0dXJufWE9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmViLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmViW2JdJiYzMDMhPXRoaXMuZWJbYl0mJjQwMyE9dGhpcy5lYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMub2EoKTtlbHNle3RoaXMuRCgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZWt8fHZiOyhmdW5jdGlvbihjKXtjLmdrPQp0LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlRhPS0xO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5MKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuZ2t8fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmJtfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuamY9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLldtKCl9LmJpbmQodGhpcyksNTAwKX0sV206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5VJiZ0aGlzLlUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksCmI9MDthLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYj1hLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuamYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuamYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXbjpmdW5jdGlvbigpe3RoaXMuamY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLlJqfHwKemI7KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnBjPTB9LGY6ZnVuY3Rpb24oKXt0aGlzLkVtPTEwO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5wY3x8KHRoaXMucGM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5nKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5wY3x8dGhpcy5wYysrLHRoaXMucGM8PXRoaXMuRW0/KHRoaXMucGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5XbigpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5Ranx8QWI7KGZ1bmN0aW9uKGMpe2MuU2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSwKdGhpcy5HKSkuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgQmI9Yy5Tanx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIERiPWMueG98fERiO25ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0iIjthLmN1cnJlbnRUaW1lJiYoYj1hLmN1cnJlbnRUaW1lKTtyZXR1cm4gYn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sS2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5VKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuUGp8fEViOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5HYSgpLGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZztiJiZiLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7YS5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5CYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMudW0oKTp0aGlzLnRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5nKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LFhrOmZ1bmN0aW9uKCl7dGhpcy5hZygpfHx0aGlzLmcoITApfSx1bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQmIoKTshYS5uYSYmYS5WJiZhLnpwJiZhLkJwJiYodGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZygpKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7YS5hZHNMb2FkZXI/YS5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2gpZm9yKHZhciBhPQpjLlpjLkJiKCksYj10aGlzLmdldFBsYXllcigpLkdhKCkuaWQsZT0wO2U8YS5sZW5ndGg7ZSsrKWFbZV0uaWQ9PWImJih0aGlzLkNoPWFbZV0pO3JldHVybiB0aGlzLkNofSxVcDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxnOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2E/dGhpcy5CYigpLmFkc0xvYWRlcj90aGlzLkQoITApOnRoaXMuRCgpOnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLk9qfHxGYjsoZnVuY3Rpb24oYyl7Yy5aYz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBrOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgRmIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Yy5aYy5CYigpO2lmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuUGsoYVtiXSk7dGhpcy5QKCl9fSk7Yy5aYy5CYj1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKGwmJmwucGxheWVyYXBpJiYoYT1sLnBsYXllcmFwaSgpKSYmYS5sZW5ndGgpcmV0dXJuIGE7dmFyIGE9W10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSwKYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCksYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kKTtpZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5aY3x8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuJGl8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnVqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RSYmKGE9YS5maXJzdENoaWxkKTtpZihhKXt0aGlzLlQoYSk7aWYoYS50YWdOYW1lKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1iP3RoaXMuVyhiKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxTcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYzpmdW5jdGlvbigpe3JldHVybiEwfSxHYTpmdW5jdGlvbigpe3ZhciBhO0U/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9CmMudWp8fFc7KGZ1bmN0aW9uKGMpe2MudGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMua2Y9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5rZj1hLmlkKTtFP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLmtmJiZjIT10aGlzLmtmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuJHApLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy50anx8WDsoZnVuY3Rpb24oYyl7Yy52aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRSlmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBXKGEpLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBYKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmphP3RoaXMucGYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEUsSmI9Yy52anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLlVtfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5ZaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLApjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlooKSk6dGhpcy5aKCk6dGhpcy5aKCk6dGhpcy5aKCl9LHduOmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxYcDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBNYj1jLllpfHxNYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5xZygpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMua2EoKX0uYmluZCh0aGlzKSl9LHFnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLkdldEFkRXJyb3JzQ2FjaGUoKSxjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5oYW5kbGVFcnJvcihiW2NdKTthLkNsZWFyQWRFcnJvcnNDYWNoZSgpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT0KYSl0aGlzLnFnKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuZygpKX19LGc6ZnVuY3Rpb24oYSl7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIE5iPWMuWGl8fE5iOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7YXx8KGE9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYSYmYS5HZXRBbGxQbGF5ZXJzJiYoYT1hLkdldEFsbFBsYXllcnMoKSkmJjA8YS5sZW5ndGgpZm9yKHZhciBiPQowO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTWIoYVtiXSk7Yy5qYXx8dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgTmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIE9iPWMuWml8fE9iLFBiPW5ldyBPYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYj1jLkltfHxRYjtuZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTsKYnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWigpfSxSZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sZm46ZnVuY3Rpb24oKXt0aGlzLlhjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWGN8fCh0aGlzLlhjPSEwLHRoaXMuUmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlhjJiYodGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlhjPSExKSx0aGlzLlJkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgUmI9Yy5qa3x8UmI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sTGg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxoLmJpbmQodGhpcyksMTApfSxiYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMub2s9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuZygpKToodGhpcy5va3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuZygpKX0sWWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuYmMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLllmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuTGgoKTt0aGlzLllmKCk7dGhpcy5qbigpfSxqbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmRuP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLmRuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuYmMoYSkpfX0pfSkoYyk7dmFyIFNiPWMuaWt8fFNiOyhmdW5jdGlvbihjKXtjLmtrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEuZm4oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgVGI9Yy5ra3x8VGIsVWI9bmV3IFRiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLmpsfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLkZoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLkptPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX1lbHNlIHRoaXMuWigpfSx3bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KbX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUGQoYSl9LmJpbmQodGhpcykpfSxQZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5GaCYmKHRoaXMuRmg9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLlpqfHxOOyhmdW5jdGlvbihjKXtjLllqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5CZSlpZih0aGlzLkhifHwKKHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuSm4oKTp0aGlzLmcoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuZygpOnRoaXMuZyghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkJlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuY2EoYSk7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5Zanx8TzsoZnVuY3Rpb24oYyl7Yy4kaj0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVGE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5wZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFdiPWMuJGp8fFdiLFhiPW5ldyBXYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYj1jLkVrfHxZYjtuZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnFqfHxZOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmloPTA7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmVkPSExO3RoaXMuSmg9ZS5MYigxMCk7dGhpcy5xaCgpfSxxaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnNiKCksITA7dGhpcy5paCsrO2lmKDEwPHRoaXMuaWgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuZyghMCk6dGhpcy5nKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5xaC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLnVhPQohMH0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgWj1jLnBqfHxaOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWSh3aW5kb3cucGxheWVyKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLnJqfHxaYiwkYj1uZXcgWmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy4kbHx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5WaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2coKX0sc2c6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBjYz1jLlVpfHwKY2M7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmphKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYz1jLldpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmM9Yy5Va3x8ZmM7bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLndpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy53aXx8Z2M7KGZ1bmN0aW9uKGMpe2Mudmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpO3RoaXMuc2UoKTt0aGlzLm9nKCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LENhOmZ1bmN0aW9uKCl7dGhpcy51YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sb2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5vYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9nLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuc2UuYmluZCh0aGlzKSwxMDApfSxzZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMudml8fGhjOyhmdW5jdGlvbihjKXtjLnhpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT0KbmV3IGdjKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgaGMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuUmEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlJhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMueGl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLm5sfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMucmg9dGhpcy50aD10aGlzLnNoPSExO3RoaXMuQ2Q9W107dGhpcy5vZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHphP251bGw6emEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgUz9udWxsOlMsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFViP251bGw6VWIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Maj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLkxsKGEpOltdLGM7dGhpcy50aD0hMDtpZihhLmxlbmd0aCl7dGhpcy5zaD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sCnRoaXMuUmgoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLm9mKXtpZih0aGlzLnJoKWJyZWFrO2M9dGhpcy5vZltkXTt0aGlzLkpmKGMpJiYodGhpcy5DZC5wdXNoKGMpLHRoaXMuUmgoYykpfX0sSmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxMbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZD1hW2VdLGQ9dGhpcy5vZltkXSx0aGlzLkpmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LFJoOmZ1bmN0aW9uKGEpe3RoaXMuSmYoYSkmJmEuZigpfSxZbjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuc2gpZm9yKHRoaXMucmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uU2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5TYil9fX0pKGMpO3ZhciBsYz1jLkxqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5nbHx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRmMoay5BbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsCmMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTt2YXIgRz1uZXcgSCxsPSExO0cuZmEoKTtHLm5oKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5mYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcubmgoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LAohMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuTmcod2luZG93LEcuZG0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5TaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy54ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTt0aGlzLkVkPTA7dGhpcy5JaD0hMTt0aGlzLmxmPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnlpPWE7YS5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3RoaXMuR2g9YX0sdmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmJiPXRoaXMucGxheWVyLlIoKX0sCmdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQW46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx6bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTsKdmFyIGQ9ITEsZj0hMTtpZih0aGlzLmVtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5wYSx0aGlzLm5iLm5mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMudm4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuJG4oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsaCk7bC54bih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuRG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5TaChsKX19LGVtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy54ZC5nZXRUaW1lKCksdGhpcy54ZD1hLDNFNTxjPyEwOiExO3RoaXMueGQ9YTtyZXR1cm4hMX0sUW46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS51ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLklnKGEpKT90aGlzLlNjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksCjApLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfSxQbjpmdW5jdGlvbihhKXtpZighdGhpcy5HaCl7ZS51ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuRm4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSWcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsubWQsdGhpcy5wbGF5ZXIubCgpKSl9fSxJZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sbW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Nbih0aGlzLlBuLmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5LYSgpfSxJZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS51ZigibWlkcm9sbCIpO2lmKCF0aGlzLndoKXt0aGlzLndoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfX0sbG46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Fbih0aGlzLklkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlplKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlFuKCk7dGhpcy5wbGF5ZXIuWmUmJnRoaXMubG4oKTt0aGlzLm1uKCl9LG5uOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkRkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5jcChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRWQ9dGhpcy5EZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkVkJiYoYT0hMCk7cmV0dXJuIGF9LHZuOmZ1bmN0aW9uKGEpe3RoaXMuSWg9YTtmb3IoYT0wO2E8dGhpcy5EZC5sZW5ndGg7YSsrKXRoaXMuRGRbYV1bImZ1bmN0aW9uIl0odGhpcy4kbS5iaW5kKHRoaXMpKX0sJG06ZnVuY3Rpb24oYSl7dGhpcy5FZC0tO2EmJnRoaXMubGYucHVzaChhKTswPj10aGlzLkVkJiZ0aGlzLkloKCl9LERtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLmxmLmxlbmd0aDtkKyspYz0KdGhpcy5sZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy55aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnBsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoZWVCaWNoYWhNaWFNZWVHaCxlZUJpY2hhaE1pYU1lZUdoKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
144.76.115.236
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.236.115.76.144.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
|
GET
H2
|
200
|
pd
eu-u.openx.net/w/1.0/
Frame CB71
Redirect Chain
-
https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
-
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
|
0
0
|
16ms
16ms
|
Document
text/html |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.167.2 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame A682
|
0
0
|
39ms
12ms
|
Document
text/html |
72.247.225.17
Akamai Technologies
|
|
General
- Full URL
- https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.247.225.17
, United States,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a72-247-225-17.deploy.static.akamaitechnologies.com
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
usync.html
eus.rubiconproject.com/
Frame A822
|
0
0
|
23ms
7ms
|
Document
text/html |
23.37.55.184
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame 9831
|
0
0
|
37ms
12ms
|
Document
text/html |
72.247.225.17
Akamai Technologies
|
|
General
- Full URL
- https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.247.225.17
, United States,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a72-247-225-17.deploy.static.akamaitechnologies.com
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
data
lb38.s400.meetrics.net/
|
43 B
308 B
|
2ms
0ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
data
b47.s79.research.de.com/
|
43 B
308 B
|
3ms
0ms
|
Image
image/gif |
144.76.237.196
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
254ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=fb3f2068-5b00-a4e5-9683-b2be5d627beb&tv={c:vK3KIl,pingTime:5,time:5068,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:28}],es:0,sc:1,ha:1,gm:0,slTimes:{i:5068,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:28,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[5060~100],as:[5060~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:257,fm:rJAVcpX+11|12|1311|1312|1313|14|15|161|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754020|1h|1i|1j|1k,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
19ms
6ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
255ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=fb3f2068-5b00-a4e5-9683-b2be5d627beb&tv={c:vK3NjC,pingTime:15,time:15067,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:28}],es:0,sc:1,ha:1,gm:0,slTimes:{i:15067,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:28,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[15058~100],as:[15058~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:259,fm:rJAVcpX+11|12|1311|1312|1313|14|15|161|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754020|1h|1i|1j|1k,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|