GET
H2
|
200
|
Primary Request
/
Show response
www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
|
147 KB
53 KB
|
120ms
103ms
|
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/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
|
GET
H2
|
200
|
source-sans-pro-v11-latin-600.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
15 KB
16 KB
|
15ms
13ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-600.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
|
GET
H2
|
200
|
source-sans-pro-v11-latin-regular.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
16 KB
16 KB
|
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-regular.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
|
GET
H2
|
200
|
lux.js
Show response
cdn.speedcurve.com/js/
|
19 KB
7 KB
|
21ms
5ms
|
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/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.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-69a0c1cafc.js
Show response
www.giga.de/static-local/dist/assets/js/
|
59 KB
19 KB
|
12ms
12ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
main-desktop-03da6b597b.css
www.giga.de/static-local/dist/assets/css/
|
365 KB
51 KB
|
14ms
14ms
|
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
|
34ms
12ms
|
Script
application/javascript |
91.215.100.39
INFONLINE-AS
|
|
|
GET
H2
|
200
|
metaTag.min.23684967c4e5261cc8575a90ffe26650.js
Show response
js.stroeermediabrands.de/
|
249 KB
60 KB
|
42ms
12ms
|
Script
application/javascript |
46.253.113.178
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
trackcp.js
Show response
gocp.stroeermediabrands.de/
|
28 KB
10 KB
|
19ms
1ms
|
Script
application/javascript |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
2501-rcm40x40.jpg
static.giga.de/wp-content/uploads/2015/05/
|
796 B
1 KB
|
34ms
8ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2015/05/2501-rcm40x40.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
103 KB
37 KB
|
32ms
19ms
|
Script
text/javascript |
2a00:1450:4001:820::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- bbca19801bbc0b3b16dd8534bdea0d56b9972beaac2741153f2313748da8be0f
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
1.gif
www.gstatic.com/psa/static/
|
53 B
341 B
|
19ms
6ms
|
Image
image/gif |
2a00:1450:4001:816::2003
Google LLC
|
|
General
- Full URL
- https://www.gstatic.com/psa/static/1.gif
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:816::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
Siri-Geld-verschicken-PayPal-rcm235x129.jpg
static.giga.de/wp-content/uploads/2016/11/
|
6 KB
6 KB
|
34ms
8ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2016/11/Siri-Geld-verschicken-PayPal-rcm235x129.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
-
https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1
-
https://ssl-econa.met.vgwort.de/blank.gif
|
43 B
310 B
|
6ms
5ms
|
Image
image/gif |
161.156.66.178
SoftLayer Technol...
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
246 B
|
6ms
5ms
|
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
18 KB
|
18ms
6ms
|
Script
text/javascript |
2a00:1450:4001:819::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-69a0c1cafc.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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/
|
77 KB
22 KB
|
20ms
7ms
|
Script
application/javascript |
13.225.86.250
Amazon.com
|
|
|
GET
H2
|
200
|
init
Show response
d.nativendo.de/cds/delivery/
|
991 B
918 B
|
26ms
12ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
identitystatus
Show response
irqs.ioam.de/
|
25 B
203 B
|
26ms
8ms
|
XHR
application/vnd.api+json |
193.46.63.75
INFONLINE-AS
|
|
General
- Full URL
- https://irqs.ioam.de/identitystatus?offerIdentifier=giga&siteIdentifier=software_content&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.02433369546402675
- Requested by
- Host: script.ioam.de
URL: https://script.ioam.de/iam.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
193.46.63.75
Alfter, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- irqs.ioam.de
- Software
-
nginx /
- Resource Hash
- 9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H/1.1
|
200
OK
|
blank.gif
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=001c&i2=001c946651479ef895db66130&ep=1593458188&vr=415&i...
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=001c&i2=001c946651479ef895db66130&ep=1593458188&vr=415&i...
-
https://de.ioam.de/blank.gif
|
43 B
651 B
|
10ms
10ms
|
Image
image/gif |
91.215.103.65
INFONLINE-AS
|
|
|
GET
H2
|
200
|
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
|
9 KB
10 KB
|
9ms
9ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
176875
Show response
videos.giga.de/embed/
Frame E2F6
|
9 KB
3 KB
|
41ms
24ms
|
Document
text/html |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
bg-teaser.png
www.giga.de/wp-content/themes/project/assets/img/teaser/
|
647 B
865 B
|
8ms
8ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
js
Show response
www.google-analytics.com/gtm/
|
60 KB
23 KB
|
14ms
14ms
|
Script
application/javascript |
2a00:1450:4001:819::200e
Google LLC
|
|
|
GET
H2
|
200
|
aps_csm.js
Show response
c.amazon-adsystem.com/bao-csm/aps-comm/
|
6 KB
3 KB
|
18ms
6ms
|
XHR
application/javascript |
13.225.86.250
Amazon.com
|
|
|
GET
H/1.0
|
200
OK
|
z.js
Show response
go.giga-abs.de/
|
1 KB
1 KB
|
31ms
7ms
|
Script
text/javascript |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/z.js?0.3293942347368355
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.0
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.20
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
X/1.0 /
- Resource Hash
- df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
Cookie set
iframe
tracking.m6r.eu/pixel/
Frame 098F
Redirect Chain
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
|
0
0
|
18ms
18ms
|
Document
text/html |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
104.109.82.87
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a104-109-82-87.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
|
47 KB
15 KB
|
26ms
14ms
|
Script
text/javascript |
216.58.207.66
Google LLC
|
|
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
122 B
505 B
|
75ms
74ms
|
XHR
text/javascript |
13.225.86.250
Amazon.com
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=2210585804791572233520171&cb=8412131018781572233520207&ws=1600x1200&v=7.39.00&t=1000&slots=%5B%7B%22sd%22%3A%22banner-1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%22rectangle-4%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Atrue%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.225.86.250
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-13-225-86-250.fra2.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- b995a3e447a3bdd20b08ebd968575f184590fc07cc5415b5e4fe92af506a7ea9
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
288 KB
89 KB
|
42ms
8ms
|
Script
application/javascript |
13.224.196.91
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
124 KB
48 KB
|
20ms
6ms
|
Script
text/javascript |
2.18.233.67
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
dmp
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://tracking.m6r.eu/sync/dmp
-
https://tracking.m6r.eu/sync/dmp?checkcookies=true
|
97 B
598 B
|
31ms
25ms
|
XHR
application/json |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
nuggad
Show response
nugmw.userreport.com/rc-ap/1b0e9a54-10e3-4932-95a3-8b9574e58075/si.nuggad.net/
Redirect Chain
-
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
-
https://nugmw.userreport.com/rc-ap/1b0e9a54-10e3-4932-95a3-8b9574e58075/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2...
|
2 KB
2 KB
|
42ms
20ms
|
Script
text/javascript |
2600:9000:2156:5000:1f:a1b:34c0:93a1
Amazon.com
|
|
General
- Full URL
- https://nugmw.userreport.com/rc-ap/1b0e9a54-10e3-4932-95a3-8b9574e58075/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2600:9000:2156:5000:1f:a1b:34c0:93a1
, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- fc55f8daa913c5f345ab2f7ad53e4280ca954f8e09c83f117056995cbe588569
|
GET
H/1.1
|
200
OK
|
ad-loading.gif
www.dunkirkinception.com/detect/
|
138 B
449 B
|
75ms
8ms
|
Image
image/png |
35.156.29.62
Amazon.com
|
|
|
GET
H2
|
200
|
tag.js
Show response
js.agkn.com/prod/v0/
|
3 KB
3 KB
|
38ms
6ms
|
Script
application/javascript |
2600:9000:20eb:5c00:15:efbc:e300:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
gocp.stroeermediabrands.de/absconf/www.giga.de/
|
14 KB
14 KB
|
10ms
4ms
|
Fetch
application/json |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
loader.js
Show response
c.nativendo.de/cdn/asset/js/
|
54 KB
17 KB
|
54ms
23ms
|
Script
application/javascript |
2606:4700:20::6819:ac0d
Cloudflare
|
|
|
GET
H2
|
200
|
post-24c513bb8a.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
7 KB
3 KB
|
9ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
giga-e4340d5047.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
31 KB
12 KB
|
9ms
9ms
|
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
|
9ms
9ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
656 B
|
29ms
15ms
|
Script
application/javascript |
2a00:1450:4001:820::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:820::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
656 B
|
28ms
14ms
|
Script
application/javascript |
2a00:1450:4001:820::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:820::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20191024/r20190131/
|
241 KB
88 KB
|
26ms
26ms
|
Script
text/javascript |
2a00:1450:4001:820::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20191024/r20190131/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 47f268fa70ff50e67818161c75ee6d6afa6e015293cbd7e2f3a63c200841af5e
- 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/r20191024/r20190131/
Frame D992
|
0
0
|
6ms
5ms
|
Document
text/html |
172.217.18.2
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20191024/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
-
172.217.18.2
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s28-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
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
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
7ms
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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&__id=1572233520283&__it=-60&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.0
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.20
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
X/1.0 /
- Resource Hash
- 2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
|
GET
H2
|
200
|
videojs-ff0ddd6c.min.js
Show response
videos.giga.de/dist/js/embed/bundle/
Frame E2F6
|
618 KB
206 KB
|
16ms
15ms
|
Script
application/javascript |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
Frame E2F6
|
273 KB
93 KB
|
34ms
14ms
|
Script
text/javascript |
2a00:1450:4001:814::200a
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
dkuim.js
Show response
dkuim.de/api/js/2/
|
465 KB
151 KB
|
61ms
16ms
|
Script
application/javascript |
178.19.65.130
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/r/
|
35 B
124 B
|
13ms
13ms
|
Image
image/gif |
2a00:1450:4001:819::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=1447515422&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=6GBAAEADQ~&jid=1204500006&gjid=268980662&cid=894296220.1572233520&tid=UA-204785-4&_gid=1817368927.1572233520&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&z=343975067
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
197 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:819::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1447515422&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEADQ~&jid=&gjid=&cid=894296220.1572233520&tid=UA-204785-4&_gid=1817368927.1572233520&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd21=auto&cm17=1&cd18=4282584&z=10976514
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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 E2F6
|
53 KB
15 KB
|
8ms
7ms
|
Stylesheet
text/css |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
play_button.svg
videos.giga.de/image/
Frame E2F6
|
1015 B
1 KB
|
8ms
8ms
|
Image
image/svg+xml |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
platform.js
Show response
apis.google.com/js/
|
48 KB
19 KB
|
38ms
27ms
|
Script
application/javascript |
2a00:1450:4001:809::200e
Google LLC
|
|
General
- Full URL
- https://apis.google.com/js/platform.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-69a0c1cafc.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
ESF /
- Resource Hash
- 3752aa6373c6cffb52d27da513bdd2f0b543bbe61b3ae7d56fd0c27c74367fd2
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
loader.js
Show response
cdn.taboola.com/libtrc/stroeer-smb-giga/
|
113 KB
22 KB
|
20ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
9ms
8ms
|
Image
image/gif |
2a00:1450:4001:819::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1447515422&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=894296220.1572233520&tid=UA-204785-4&_gid=1817368927.1572233520&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm75=1&z=672604981
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
93 B
|
9ms
8ms
|
Image
image/gif |
2a00:1450:4001:819::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1447515422&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal-Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=894296220.1572233520&tid=UA-204785-4&_gid=1817368927.1572233520&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cm75=1&z=993287627
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
93 B
|
9ms
7ms
|
Image
image/gif |
2a00:1450:4001:819::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1447515422&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=894296220.1572233520&tid=UA-204785-4&_gid=1817368927.1572233520&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cm75=1&z=1260781812
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
93 B
|
8ms
7ms
|
Image
image/gif |
2a00:1450:4001:819::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1447515422&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEADQ~&jid=&gjid=&cid=894296220.1572233520&tid=UA-204785-4&_gid=1817368927.1572233520&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Image&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cm75=1&z=1669030751
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
93 B
|
8ms
7ms
|
Image
image/gif |
2a00:1450:4001:819::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1447515422&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Android)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=894296220.1572233520&tid=UA-204785-4&_gid=1817368927.1572233520&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cm75=1&z=924552291
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
93 B
|
8ms
7ms
|
Image
image/gif |
2a00:1450:4001:819::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1447515422&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(iOS)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=894296220.1572233520&tid=UA-204785-4&_gid=1817368927.1572233520&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cm75=1&z=281845179
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
93 B
|
7ms
6ms
|
Image
image/gif |
2a00:1450:4001:819::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1447515422&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Windows%20Phone)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=894296220.1572233520&tid=UA-204785-4&_gid=1817368927.1572233520&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cm75=1&z=422382307
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
|
jquery.min.js
Show response
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
|
85 KB
30 KB
|
8ms
6ms
|
Script
text/javascript |
2a00:1450:4001:814::200a
Google LLC
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 01B8
|
0
0
|
253ms
253ms
|
Document
text/html |
172.217.18.2
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1572233520&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&dt=1572233520251&bpp=10&bdt=194&fdt=158&idt=159&shv=r20191024&cbv=r20190131&saldr=aa&abxe=1&correlator=8528012208437&frm=20&pv=2&ga_vid=894296220.1572233520&ga_sid=1572233520&ga_hid=1447515422&ga_fc=0&iag=0&icsg=206696344322&dssz=63&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=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21064124&oid=3&pvsid=3145006326530755&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=a!1&fsb=1&xpc=ofMV9EldAQ&p=https%3A//www.giga.de&dtd=195
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191024/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.18.2
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s28-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.js
Show response
www.googletagservices.com/activeview/js/current/
|
77 KB
29 KB
|
25ms
13ms
|
Script
text/javascript |
2a00:1450:4001:818::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/r20191024/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 10d89b46d38acf8cb3b7696a859f6f2df157650230b4e0f5b658da47bbc49586
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_2019102101.js
Show response
securepubads.g.doubleclick.net/gpt/
|
156 KB
57 KB
|
14ms
14ms
|
Script
text/javascript |
216.58.207.66
Google LLC
|
|
|
GET
H2
|
200
|
nativendo.css
c.nativendo.de/cdn/asset/css/
|
5 KB
1 KB
|
17ms
17ms
|
Stylesheet
text/css |
2606:4700:20::6819:ac0d
Cloudflare
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
iu3
aax-eu.amazon-adsystem.com/s/
Frame 2343
Redirect Chain
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
|
0
0
|
188ms
188ms
|
Document
text/html |
52.94.220.16
Amazon.com
|
|
General
- Full URL
- https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.94.220.16
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
Server /
- Resource Hash
|
GET
H2
|
200
|
ad_popup_Y7GQ_BlBTGN45.gif
www.giga.de/imagex/
|
71 B
474 B
|
35ms
35ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 9CBA
|
0
0
|
15ms
15ms
|
Document
text/html |
172.217.18.2
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1572233520&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1572233520261&bpp=6&bdt=205&fdt=232&idt=232&shv=r20191024&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=8528012208437&frm=20&pv=1&ga_vid=894296220.1572233520&ga_sid=1572233520&ga_hid=1447515422&ga_fc=0&iag=0&icsg=826785377290&dssz=65&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=21064124&oid=3&pvsid=3145006326530755&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=a!1&fsb=1&dtd=236
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191024/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.18.2
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s28-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
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
|
|
|
GET
H/1.1
|
200
OK
|
t.png
gocp.stroeermediabrands.de/
|
98 B
355 B
|
1ms
1ms
|
Image
image/png |
188.40.16.106
HETZNER-AS
|
|
General
- Full URL
- https://gocp.stroeermediabrands.de/t.png?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&contentPieceId=2857946&publishDate=2016-09-22T12%3A38%3A19%2B02%3A00&_=1572233520503.1754715891
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.16.106
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.106.16.40.188.clients.your-server.de
- Software
-
/
- Resource Hash
- ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:819::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1447515422&t=event&ni=1&_s=10&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=894296220.1572233520&tid=UA-204785-4&_gid=1817368927.1572233520&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm76=1&z=1263226721
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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.20191022-13-RELEASE.js
Show response
cdn.taboola.com/libtrc/
|
390 KB
110 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
|
19ms
7ms
|
Script
application/x-javascript |
172.227.124.249
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
bootstrap.min.js
Show response
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
|
36 KB
10 KB
|
23ms
8ms
|
Script
text/javascript |
2001:4de0:ac19::1:b:2a
Highwinds Network...
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
11 KB
5 KB
|
226ms
226ms
|
XHR
text/plain |
216.58.207.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3145006326530755&correlator=1125313757924607&output=ldjh&impl=fif&adsid=NT&eid=21064124%2C21065017&vrg=2019102101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191028&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=800x450%7C580x500%7C580x360%7C42x31&scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D5%26smb-hour%3D4%26yt%3D0%26adset%3Dbrsl%26mbrid%3D021fdbf30dd8d372e04d562ade424c22%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1572233520&dt=1572233520618&dlt=1572233520056&idt=494&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3541345729&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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=69&icsg=13228566036658&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=625x0&msz=800x450&ga_vid=894296220.1572233520&ga_sid=1572233520&ga_hid=1447515422&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 4d690540c68ee5a1234f1d22578349ee8a669f65fde25a1878d2afb8aff7d2c0
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019102101.js
Show response
securepubads.g.doubleclick.net/gpt/
|
64 KB
24 KB
|
14ms
13ms
|
Script
text/javascript |
216.58.207.66
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/
|
0
0
|
19ms
6ms
|
Other
text/html |
2a00:1450:4001:80b::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_2019102101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::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
|
221ms
221ms
|
XHR
text/plain |
216.58.207.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3145006326530755&correlator=1125313757924607&output=ldjh&impl=fif&adsid=NT&eid=21064124%2C21065017&vrg=2019102101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191028&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=1x1&ists=1&scp=as%3Dout-of-page%26adslot%3Dout-of-page%26pc%3D1&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D5%26smb-hour%3D4%26yt%3D0%26adset%3Dbrsl%26mbrid%3D021fdbf30dd8d372e04d562ade424c22%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1572233520&dt=1572233520628&dlt=1572233520056&idt=494&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2858038163&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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=70&icsg=13228566036658&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x-1&msz=1x-1&ga_vid=894296220.1572233520&ga_sid=1572233520&ga_hid=1447515422&fws=640&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 35dee9a3123e415eaf6f129bd74dfc2100f7fe01f01f10593f85e6fff8c013d2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
122 B
505 B
|
77ms
76ms
|
XHR
text/javascript |
13.225.86.250
Amazon.com
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=2210585804791572233520171&cb=5571179199441572233520637&ws=1600x1200&v=7.39.00&t=1000&slots=%5B%7B%22sd%22%3A%22banner%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%7D%2C%7B%22sd%22%3A%22rectangle%22%2C%22s%22%3A%5B%22300x250%22%5D%7D%2C%7B%22sd%22%3A%22sky%22%2C%22s%22%3A%5B%22300x600%22%2C%22160x600%22%2C%22200x600%22%2C%22120x600%22%2C%22301x601%22%5D%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Atrue%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.225.86.250
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-13-225-86-250.fra2.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- c634fa96b6cc862b10478d1a1622df02f6e97cc22698c432eb4bb230eb711254
|
GET
H/1.1
|
200
OK
|
cygnus
Show response
as-sec.casalemedia.com/
|
24 B
900 B
|
141ms
128ms
|
XHR
application/json |
2.18.234.21
Akamai Technologies
|
|
General
- Full URL
- https://as-sec.casalemedia.com/cygnus?s=254711&v=7.2&r=%7B%22id%22%3A%2218e88f9ab37f1e%22%2C%22imp%22%3A%5B%7B%22id%22%3A%222c7b52f718227%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22254711%22%2C%22sid%22%3A%221%22%7D%7D%2C%7B%22id%22%3A%2238b0de1846027e%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2244345361ffbbd2%22%2C%22banner%22%3A%7B%22w%22%3A160%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2252ee933cd4300c%22%2C%22banner%22%3A%7B%22w%22%3A200%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2264ee4084690769%22%2C%22banner%22%3A%7B%22w%22%3A120%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%22763091606083b3%22%2C%22banner%22%3A%7B%22w%22%3A301%2C%22h%22%3A601%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%228a99f2708e45f4%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%22966955958061a6%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%22107d1fe3642bf55%22%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%22115e702370bea31%22%2C%22banner%22%3A%7B%22w%22%3A728%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%7D%2C%22ext%22%3A%7B%22source%22%3A%22prebid%22%7D%7D&ac=j&sd=1&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.234.21
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-234-21.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- 9e283dd532485b23b860dfc75e9c7de46e122fd4327acf2ad67d6060a9c8db99
|
GET
H2
|
200
|
ADTECH;apid=1A80a14bac-f933-11e9-817f-026a0c743042;cfp=1;rndc=1572233519;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1572233520645
Show response
adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/
Redirect Chain
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1572233520645;
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;cfp=1;rndc=1572233520;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1572233520645
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6658212/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=1;rndc=1572233519;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1572233520645
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6658212/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=2;rndc=1572233520;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1572233520645
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;apid=1A80a14bac-f933-11e9-817f-026a0c743042;cfp=1;rndc=1572233519;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1572233520645
|
46 B
240 B
|
26ms
26ms
|
XHR
application/json |
152.199.22.2
MCI Communication...
|
|
General
- Full URL
- https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;apid=1A80a14bac-f933-11e9-817f-026a0c743042;cfp=1;rndc=1572233519;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1572233520645
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
152.199.22.2
, United States,
ASN15133
(EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
- Reverse DNS
- Software
-
Adtech Adserver /
- Resource Hash
- f8f176082897085809b8bb256d5292258aa8c761799b19fa8721cd5344a1157d
|
GET
H2
|
200
|
ADTECH;apid=1A80a0fb2a-f933-11e9-a062-022946a68422;cfp=1;rndc=1572233520;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1572233520645
Show response
adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/
Redirect Chain
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1572233520645;
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;cfp=1;rndc=1572233520;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1572233520645
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6670994/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=1;rndc=1572233520;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1572233520645
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6670994/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=2;rndc=1572233519;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1572233520645
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;apid=1A80a0fb2a-f933-11e9-a062-022946a68422;cfp=1;rndc=1572233520;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1572233520645
|
47 B
241 B
|
28ms
27ms
|
XHR
application/json |
152.199.22.2
MCI Communication...
|
|
General
- Full URL
- https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;apid=1A80a0fb2a-f933-11e9-a062-022946a68422;cfp=1;rndc=1572233520;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1572233520645
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
152.199.22.2
, United States,
ASN15133
(EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
- Reverse DNS
- Software
-
Adtech Adserver /
- Resource Hash
- 5d48e0e7106186aa91feb957b0faa1768a2b6dc804402f0bd014aff10b5e9d26
|
GET
H2
|
200
|
ADTECH;apid=1A80a0fdc8-f933-11e9-807b-0286a668bb76;cfp=1;rndc=1572233520;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1572233520645
Show response
adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/
Redirect Chain
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1572233520645;
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;cfp=1;rndc=1572233520;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1572233520645
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6669693/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=1;rndc=1572233520;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1572233520645
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6669693/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=2;rndc=1572233520;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1572233520645
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;apid=1A80a0fdc8-f933-11e9-807b-0286a668bb76;cfp=1;rndc=1572233520;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1572233520645
|
47 B
267 B
|
27ms
26ms
|
XHR
application/json |
152.199.22.2
MCI Communication...
|
|
General
- Full URL
- https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;apid=1A80a0fdc8-f933-11e9-807b-0286a668bb76;cfp=1;rndc=1572233520;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1572233520645
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
152.199.22.2
, United States,
ASN15133
(EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
- Reverse DNS
- Software
-
Adtech Adserver /
- Resource Hash
- 2f59490cc100425610e68543417ee4ad0a9610b32492c1753473b4d4ef501f55
|
GET
H2
|
200
|
/
Show response
adx.adform.net/adx/
|
15 B
411 B
|
97ms
52ms
|
XHR
application/json |
37.157.2.237
ADFORM
|
|
General
- Full URL
- https://adx.adform.net/adx/?rp=4&bWlkPTY2NjQ0MyZ0cmFuc2FjdGlvbklkPTIyMjFiNTBmLTJhMzEtNDU3MS05OGU3LTI1MDRiZDQ1ZWY4Mw%3D%3D&bWlkPTcxMzMyNiZ0cmFuc2FjdGlvbklkPWVmMWQwZjdhLTEwOTMtNGJkYS05ZTQ3LWQxMDI5MGNkMjI2ZQ%3D%3D&bWlkPTcwNjE1MSZ0cmFuc2FjdGlvbklkPTVlNWM3MmJkLTA0ODktNDJjYi1iMGNlLTQxODkxYzA3YzNlZQ%3D%3D&pt=gross&stid=ca466a61-1fbb-46cb-a4d6-5f63fa82066a&fd=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
-
37.157.2.237
, Denmark,
ASN198622
(ADFORM, DK),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 631bc9fa39ddcdd4008398e649671ba79db3cc7c1725d7b8cd9823ec243f0a48
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
1 KB
2 KB
|
21ms
21ms
|
XHR
application/json |
185.33.223.100
AppNexus
|
|
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
94ms
48ms
|
XHR
application/json |
185.86.139.58
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
124ms
77ms
|
XHR
application/json |
185.86.139.58
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
100ms
54ms
|
XHR
application/json |
185.86.139.58
SMARTADSERVER
|
|
|
GET
H2
|
200
|
arj
Show response
yieldlove-d.openx.net/w/1.0/
|
4 KB
5 KB
|
37ms
20ms
|
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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-60&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=2221b50f-2a31-4571-98e7-2504bd45ef83%2Cef1d0f7a-1093-4bda-9e47-d10290cd226e%2C5e5c72bd-0489-42cb-b0ce-41891c07c3ee&nocache=1572233520648&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.165.0 /
- Resource Hash
- 30bb112a4b7ec9c16ceef161bf6d0207b184e3ba90329c90394550d5d8a11e21
|
GET
H/1.1
|
200
OK
|
submit
lb51.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
12ms
1ms
|
Image
image/gif |
136.243.4.81
HETZNER-AS
|
|
General
- Full URL
- https://lb51.s400.meetrics.net/bb-mx/submit?/UN35BGAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwStIBPAAAAAAAAAOAAAAGAAAAAAAZwStIBBRksFAQtjFTzi9SA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.81
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h229.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb51.s400.meetrics.net/
|
43 B
308 B
|
11ms
0ms
|
Image
image/gif |
136.243.4.81
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
nuggad
ih.adscale.de/
|
49 B
487 B
|
15ms
15ms
|
Image
image/gif |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
api
Show response
cdn.m6r.eu/sync/
|
1 KB
1 KB
|
20ms
6ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
/
d.agkn.com/iframe/8613/
Frame CF2B
|
0
0
|
35ms
8ms
|
Document
text/html |
3.121.36.175
Amazon.com
|
|
General
- Full URL
- https://d.agkn.com/iframe/8613/?che=120498301&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
- Requested by
- Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
3.121.36.175
Frankfurt am Main, Germany,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-3-121-36-175.eu-central-1.compute.amazonaws.com
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
|
GET
H2
|
200
|
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/
Frame E2F6
|
30 KB
30 KB
|
40ms
12ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://files.giga-video.de/75/ed/96/145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:819::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1447515422&t=event&ni=1&_s=11&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=176875%20--%20so-funktioniert-paypal-hd.mp4%5Bvideojs%2F7.6.5%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=894296220.1572233520&tid=UA-204785-4&_gid=1817368927.1572233520&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.5&cd44=1&cm1=1&z=93889536
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
|
json
Show response
trc.taboola.com/stroeer-smb-giga/trc/3/
|
17 KB
7 KB
|
129ms
128ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=04%3A32%3A00.734<i=deflated&data=%7B%22id%22%3A514%2C%22ii%22%3A%22%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1572233520729%2C%22cv%22%3A%2220191022-13-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%22cmps%22%3A3%2C%22btv%22%3A%220%22%2C%22cos%22%3A%224g%22%2C%22bad%22%3A-1%2C%22sw%22%3A1600%2C%22sh%22%3A1200%2C%22bw%22%3A1600%2C%22sde%22%3A%221.000%22%2C%22bh%22%3A1200%2C%22dw%22%3A1585%2C%22dh%22%3A4653%2C%22r%22%3A%5B%7B%22li%22%3A%22rbox-t2m%22%2C%22s%22%3A9%2C%22uim%22%3A%22alternating-thumbnails-a%3Aabp%3D0%22%2C%22uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22orig_uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22cd%22%3A3055.3125%2C%22mw%22%3A625%7D%5D%2C%22cb%22%3A%22TRC.callbacks.recommendations_1%22%2C%22lt%22%3A%22deflated%22%7D
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191022-13-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
- a585b08fbc1752a7c9738e429b68e3fbd84bc93fbef0d78ea62d8b538503d825
|
GET
BLOB
|
200
OK
|
507a5d10-f87f-479e-8ee8-95c9faeb2d4c
https://videos.giga.de/
Frame E2F6
|
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 E2F6
|
53 B
642 B
|
33ms
12ms
|
XHR
application/json |
52.219.73.111
Amazon.com
|
|
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame E2F6
|
265 B
436 B
|
7ms
6ms
|
XHR
application/json |
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=1572233520762&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps...
-
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1572233520762&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapp...
|
0
248 B
|
6ms
6ms
|
Image
text/plain |
172.227.124.249
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
12 KB
5 KB
|
291ms
291ms
|
XHR
text/plain |
216.58.207.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3145006326530755&correlator=1125313757924607&output=ldjh&impl=fif&adsid=NT&eid=21064124%2C21065017&vrg=2019102101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191028&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C468x60%7C728x180%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A20918.default%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26yieldlove_reloaded%3Dfalse%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D5%26smb-hour%3D4%26yt%3D0%26adset%3Dbrsl%26mbrid%3D021fdbf30dd8d372e04d562ade424c22%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound%26nuggad%3Dn127-0%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-3%252Cn155-1%252Cn133-1%252Cn106-1%252Cn153-1%252Cn11-2%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-4%252Cn2-2%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-1%252Cn76-1%252Cn66-0%252Cn60-1%252Cn139-0%252Cn160-0%252Cn107-0%252Cn51-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-0%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-1%252Cn118-2%252Cn85-0%252Cn9-3%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-1%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-1%252Cn43-1%252Cn55-1%252Cn142-0%252Cn7-1%252Cn103-1%252Cn158-1%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-1%252Cn84-1%252Cn5-4%252Cn48-1%252Cn109-0%252Cn122-2%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-1%252Cn156-0%252Cn148-1&cookie_enabled=1&bc=31&abxe=1&lmt=1572233520&dt=1572233520771&dlt=1572233520056&idt=494&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3040188762&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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=72&icsg=52914264146626&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=894296220.1572233520&ga_sid=1572233520&ga_hid=1447515422&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 2dc9fae1e9610857f10a66935fcd1f0505524bfedb0e76b5de2233cf829e7e65
- 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
|
482ms
482ms
|
XHR
text/plain |
216.58.207.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3145006326530755&correlator=1125313757924607&output=ldjh&impl=fif&adsid=NT&eid=21064124%2C21065017&vrg=2019102101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191028&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A9501.default%26yieldlove_meta%3Dpid%253A9501.sb%253Af%26yieldlove_pid%3D9501%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26yieldlove_reloaded%3Dfalse%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D5%26smb-hour%3D4%26yt%3D0%26adset%3Dbrsl%26mbrid%3D021fdbf30dd8d372e04d562ade424c22%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound%26nuggad%3Dn127-0%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-3%252Cn155-1%252Cn133-1%252Cn106-1%252Cn153-1%252Cn11-2%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-4%252Cn2-2%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-1%252Cn76-1%252Cn66-0%252Cn60-1%252Cn139-0%252Cn160-0%252Cn107-0%252Cn51-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-0%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-1%252Cn118-2%252Cn85-0%252Cn9-3%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-1%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-1%252Cn43-1%252Cn55-1%252Cn142-0%252Cn7-1%252Cn103-1%252Cn158-1%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-1%252Cn84-1%252Cn5-4%252Cn48-1%252Cn109-0%252Cn122-2%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-1%252Cn156-0%252Cn148-1&cookie_enabled=1&bc=31&abxe=1&lmt=1572233520&dt=1572233520776&dlt=1572233520056&idt=494&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3694558186&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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=72&icsg=52914264146626&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=894296220.1572233520&ga_sid=1572233520&ga_hid=1447515422&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- b70ca2f3dff893d421a6862add22b317e26b941021298697b5492a90710e0025
- 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
|
481ms
480ms
|
XHR
text/plain |
216.58.207.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3145006326530755&correlator=1125313757924607&output=ldjh&impl=fif&adsid=NT&eid=21064124%2C21065017&vrg=2019102101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191028&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A19051.default%26yieldlove_meta%3Dpid%253A19051.sb%253Af%26yieldlove_pid%3D19051%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26yieldlove_reloaded%3Dfalse%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D5%26smb-hour%3D4%26yt%3D0%26adset%3Dbrsl%26mbrid%3D021fdbf30dd8d372e04d562ade424c22%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound%26nuggad%3Dn127-0%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-3%252Cn155-1%252Cn133-1%252Cn106-1%252Cn153-1%252Cn11-2%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-4%252Cn2-2%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-1%252Cn76-1%252Cn66-0%252Cn60-1%252Cn139-0%252Cn160-0%252Cn107-0%252Cn51-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-0%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-1%252Cn118-2%252Cn85-0%252Cn9-3%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-1%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-1%252Cn43-1%252Cn55-1%252Cn142-0%252Cn7-1%252Cn103-1%252Cn158-1%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-1%252Cn84-1%252Cn5-4%252Cn48-1%252Cn109-0%252Cn122-2%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-1%252Cn156-0%252Cn148-1&cookie_enabled=1&bc=31&abxe=1&lmt=1572233520&dt=1572233520781&dlt=1572233520056&idt=494&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=946476008&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%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=72&icsg=52914264146626&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=894296220.1572233520&ga_sid=1572233520&ga_hid=1447515422&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019102101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 01ab6db459b4fa0a90b5d75ce8a3cc6fd3ef4d75a2f87f85f8d10897cc46f436
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
Show response
d.nativendo.de/cds/delivery/get/
|
9 KB
3 KB
|
37ms
36ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
0
376 B
|
29ms
29ms
|
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=0&n121=1&n116=0&n104=1&n15=3&n155=1&n133=1&n106=1&n153=1&n11=2&n120=2&n154=1&n125=1&n8=4&n2=2&n137=0&n101=0&n108=1&n54=0&n110=0&n87=0&n149=1&n76=1&n66=0&n60=1&n139=0&n160=0&n107=0&n51=1&n117=4&n86=0&n147=4&n64=0&n119=6&n22=1&n18=1&n161=1&n126=1&n92=2&n62=1&n57=1&n77=0&n83=0&n102=0&n105=0&n159=1&n20=1&n80=0&n12=0&n141=0&n157=0&n99=0&n128=1&n118=2&n85=0&n9=3&n6=2&n63=0&n138=0&n140=1&n94=2&n111=0&n136=0&n79=1&n93=4&n90=1&n43=1&n55=1&n142=0&n7=1&n103=1&n158=1&n124=0&n75=0&n91=1&n46=1&n114=1&n69=0&n47=1&n10=3&n3=1&n82=1&n84=1&n5=4&n48=1&n109=0&n122=2&n67=1&n115=1&n89=1&n123=1&n17=1&n78=0&n44=1&n81=1&n88=1&n156=0&n148=1
- Requested by
- Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
104.109.82.87
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a104-109-82-87.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame E2F6
|
653 B
1 KB
|
62ms
6ms
|
XHR
application/json |
13.224.196.127
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
config.js
Show response
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
|
39 KB
10 KB
|
22ms
5ms
|
Script
text/javascript |
151.101.13.194
Fastly
|
|
|
POST
H/1.1
|
200
OK
|
native
Show response
native.adscale.de/
|
157 B
603 B
|
69ms
34ms
|
XHR
application/json |
104.111.246.233
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/201910171256/
|
28 KB
11 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.13.194
Fastly
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/201910171256/wrap.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.13.194
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 51fbe136f28f60bc09b2a92ec09f109e560fb76b14d564e46fbd39cc6020f425
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 2209
|
0
75 B
|
16ms
15ms
|
Fetch
image/gif |
216.58.207.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstUAP-PwuLyWK77ruDYXVgTy3Rzsse9syNAmxKxBwavY0AFnvypjr669zVW1MXykeeUEPIZU1Rf70zbskylSmi-AK8tDO0emfZKjsUG4gjwhFFwwM7F9bRPZsOZGhvAUne7ubQr5imHQipOecenjLuj4CgwhmrEZcwIhOvRuyAwR9hoO_P7QbeOYsgzsHv1rRr1aZrBFaie48ARInVKfNH9x-aspkQHdgoCAW0xL1-KfrMleXwvSMsvGbFHvuKVak0ss04tYawl9DbfOlLauYKHVg&sig=Cg0ArKJSzFjg-T8axpUOEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
video.php
Show response
media.oadts.com/www/delivery/
Frame 2209
|
108 KB
108 KB
|
26ms
6ms
|
Script
text/javascript |
185.22.221.117
WAVECON
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 2209
|
77 KB
29 KB
|
13ms
13ms
|
Script
text/javascript |
2a00:1450:4001:818::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_2019102101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 4bb582e7871641e76297261eaae8920a4ea1e5e9b0587cb5f550633b15891c05
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/
Frame ED2E
Redirect Chain
-
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuKMGF1oEk79DYn64q2FIzoYt4sk7pgDMSBicYoulAzbczf2Kf3lEAjGtdqe12d5HPZCuLJytAmNbBf-0IXFw93mvrZyiSKfwnlS2w9YF_bYWOZpLGaFKo7N8spuZXssCfy6OroGriVY...
-
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
|
49 B
343 B
|
24ms
6ms
|
Image
image/gif |
2a02:26f0:6c00:194::5f76
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
Frame E2F6
|
206 KB
60 KB
|
7ms
6ms
|
XHR
application/javascript |
13.224.196.127
Amazon.com
|
|
|
GET
H2
|
200
|
tb
Show response
15.taboola.com/
|
29 KB
30 KB
|
35ms
20ms
|
Script
text/html |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://15.taboola.com/tb?oid=15&pubnm=stroeer-smb-giga&unitType=244&tbloc=&pageType=text&pstn=Below%20Article%20Feed%20-%20Video&uuip=Feed%20-%20Below%20Article%20Feed%20-%20Video&cisrf=&cirf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&encoded=1&uid=889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0&variant=611715|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1572233520880&tagid=&cntry=DE&platform=1&sesid=f754e4c87a9f9336b329943f0cdadab5&itemid=/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme&viewid=1572233520729&geolat=&geoing=&deviceifa=&appid=&sd=v2_f754e4c87a9f9336b329943f0cdadab5_889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0_1572233520_1572233520_CNawjgYQrMVBGNnMroPhLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA&ri=2569c7d94f27168fe62f84a9f1aa8212&appname=&cdb=&gdprApplies=&rid=&sii=333075201540415599
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191022-13-RELEASE.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- 1974829bada0ccf499797760db562fa2b0f5f92e133110ee75b6fe7dcc2c16c0
|
GET
H2
|
200
|
feed-card-placeholder.20191022-13-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
5 KB
2 KB
|
6ms
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
|
6ms
5ms
|
Image
image/svg+xml |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
userx.20191022-13-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 FB90
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=5834f520-2d86-403f-9178-9b775ad81e96
|
0
56 B
|
14ms
14ms
|
Image
text/plain |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=5834f520-2d86-403f-9178-9b775ad81e96
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
204
No Content
|
sync.php
pixel.rubiconproject.com/exchange/
Frame FB90
|
0
239 B
|
7ms
6ms
|
Image
image/gif |
69.173.144.136
The Rubicon Project
|
|
General
- Full URL
- https://pixel.rubiconproject.com/exchange/sync.php?p=16698
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_256_GCM
- Server
-
69.173.144.136
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/
Frame FB90
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=QyDzlp-Han8G8Ogoc5aQty6c51U-2bL8txmeWihLaJE%3D
|
45 B
96 B
|
14ms
14ms
|
Image
image/gif |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=QyDzlp-Han8G8Ogoc5aQty6c51U-2bL8txmeWihLaJE%3D
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/mediamath-ssp-network/1/
Frame FB90
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=691b5db6-5aa0-4200-956f-d63521e78fb8
-
https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=691b5db6-5aa0-4200-956f-d63521e78fb8&tbid=889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0&query=taboola_hm%3D691b5db6-5aa0-420...
|
0
52 B
|
14ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=691b5db6-5aa0-4200-956f-d63521e78fb8&tbid=889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0&query=taboola_hm%3D691b5db6-5aa0-4200-956f-d63521e78fb8
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
204
|
/
trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/
Frame FB90
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=SZMbrbEyN4Qk&ev=1&pid=562107
|
0
172 B
|
14ms
14ms
|
Image
text/plain |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=SZMbrbEyN4Qk&ev=1&pid=562107
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/appnexus-network/1/
Frame FB90
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=6442362538625577549
-
https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=6442362538625577549&tbid=889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0&query=taboola_hm%3D6442362538625577549
|
0
153 B
|
29ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=6442362538625577549&tbid=889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0&query=taboola_hm%3D6442362538625577549
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/google-network/1/
Frame FB90
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=CAESEKKIh3K5OQWeekWsFHqu8zs&google_cver=1
-
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEKKIh3K5OQWeekWsFHqu8zs&tbid=889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0&query=taboola_hm%3DCAESEKKIh3K5OQWeekWsFHqu8zs%26goo...
|
0
52 B
|
29ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEKKIh3K5OQWeekWsFHqu8zs&tbid=889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0&query=taboola_hm%3DCAESEKKIh3K5OQWeekWsFHqu8zs%26google_cver%3D1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
204
|
/
trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/
Frame FB90
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=6442362538625577549
|
0
169 B
|
14ms
14ms
|
Image
text/plain |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=6442362538625577549
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/thetradedesk-network/1/
Frame FB90
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=1d91db62-aecf-4fac-a7e3-54aa530c76a5
-
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=1d91db62-aecf-4fac-a7e3-54aa530c76a5&tbid=889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0&query=taboola_hm%3D1d91db62-aecf-4fac...
|
0
52 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=1d91db62-aecf-4fac-a7e3-54aa530c76a5&tbid=889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0&query=taboola_hm%3D1d91db62-aecf-4fac-a7e3-54aa530c76a5
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/storygize-network/1/
Frame FB90
Redirect Chain
-
https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0
-
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=ed9c3519-36cf-4832-88c0-24ec016dfca5
-
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=ed9c3519-36cf-4832-88c0-24ec016dfca5&tbid=889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0&query=taboola_hm%3Ded9c3519-36cf-4832-88...
|
0
52 B
|
30ms
30ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=ed9c3519-36cf-4832-88c0-24ec016dfca5&tbid=889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0&query=taboola_hm%3Ded9c3519-36cf-4832-88c0-24ec016dfca5
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
cookiesync
bttrack.com/pixel/
Frame FB90
|
35 B
380 B
|
384ms
97ms
|
Image
image/gif |
192.132.33.46
Bidtellect Inc.
|
|
|
GET
H/1.1
|
200
OK
|
/
cds.taboola.com/
Frame FB90
|
0
292 B
|
350ms
159ms
|
Image
text/plain |
130.211.13.252
Google LLC
|
|
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/bidswitch-network/1/
Frame FB90
Redirect Chain
-
https://x.bidswitch.net/sync?ssp=taboola
-
https://ads.creative-serving.com/bsw_sync?bidswitch_ssp_id=taboola&bsw_custom_parameter=90ae4c9d-cc0c-4229-b1ff-c94ef0ec669a
-
https://ads.creative-serving.com/ul_cb/bsw_sync?bidswitch_ssp_id=taboola&bsw_custom_parameter=90ae4c9d-cc0c-4229-b1ff-c94ef0ec669a
-
https://x.bidswitch.net/sync?dsp_id=4&user_id=6f659a85-b998-47fa-9b03-2e3beefeb08d&ssp=taboola&expires=30&user_group=5&bsw_param=90ae4c9d-cc0c-4229-b1ff-c94ef0ec669a
-
https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=90ae4c9d-cc0c-4229-b1ff-c94ef0ec669a
-
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=90ae4c9d-cc0c-4229-b1ff-c94ef0ec669a&tbid=889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0&query=taboola_hm%3D90ae4c9d-cc0c-4229-b1...
|
0
52 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=90ae4c9d-cc0c-4229-b1ff-c94ef0ec669a&tbid=889d5ff5-90e9-4647-8a81-de8dad538e97-tuct4afe6b0&query=taboola_hm%3D90ae4c9d-cc0c-4229-b1ff-c94ef0ec669a
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:819::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1447515422&t=event&ni=1&_s=12&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEADQ~&jid=&gjid=&cid=894296220.1572233520&tid=UA-204785-4&_gid=1817368927.1572233520&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cm73=1&cm13=1&z=871325133
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
259 B
|
15ms
14ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
56 B
|
14ms
14ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
55 B
|
14ms
14ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
60 B
|
22ms
22ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
userconnect.js
Show response
js.adscale.de/
|
13 KB
5 KB
|
19ms
6ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
0
Show response
d.nativendo.de/cds/delivery/render/54wh7pxc/182yo/5rlkw/83zeo/
|
4 KB
2 KB
|
20ms
19ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
a2638715-566b-43f0-a268-c79986ca7154
Show response
t.nativendo.de/cds/tracking/event/
|
0
172 B
|
17ms
17ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
General
- Full URL
- https://t.nativendo.de/cds/tracking/event/a2638715-566b-43f0-a268-c79986ca7154?aid=182yo&floor=YTI2Mzg3MTUtNTY2Yi00M-spes-XKEf-IXYvhA&cpm=&dsp=1&t[0]=rtb%2Fauction&t[1]=rtb%2Frequest&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1572233521
- Requested by
- Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1174
- 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
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 2209
|
43 B
307 B
|
5ms
5ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 2209
|
43 B
307 B
|
5ms
5ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 2209
|
43 B
307 B
|
8ms
5ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame E2F6
|
206 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
|
254 B
765 B
|
6ms
6ms
|
Image
image/png |
151.101.14.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
avc.php
Show response
media.oadts.com/www/delivery/
Frame 2209
|
12 KB
12 KB
|
11ms
11ms
|
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=atg9432157056&startmuted=1&cb=0.3501400530560881&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&autostart=1
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, CHACHA20_POLY1305
- Server
-
185.22.221.117
, Germany,
ASN60955
(WAVECON, DE),
- Reverse DNS
- wv-gw1.wavecloud.de
- Software
-
lighttpd/1.4.45 /
- Resource Hash
- ce1cbeb8044bc0362c0f2c545dce858f4d265f734bbd566b10d5d05df089b988
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 2209
|
43 B
307 B
|
10ms
5ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H2
|
200
|
creative_js.js
Show response
vidstat.taboola.com/vpaid/units/14_12_0/creatives/
|
4 KB
2 KB
|
7ms
5ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
getAd
Show response
video-adserver.ibillboard.com/
Frame 2209
|
1 KB
1 KB
|
102ms
28ms
|
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=d6fcea9047&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.125
Prague, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- host-125.billboard.cz
- Software
-
ibillboard /
- Resource Hash
- b0733d89895418f0b20e317d7917d33d4664d48e109ff3433678bb1629848a7b
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 2209
|
43 B
307 B
|
5ms
5ms
|
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.7340063655545055&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2Fhttps%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dur=0
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, CHACHA20_POLY1305
- Server
-
185.22.221.117
, Germany,
ASN60955
(WAVECON, DE),
- Reverse DNS
- wv-gw1.wavecloud.de
- Software
-
lighttpd/1.4.45 /
- Resource Hash
- 4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
|
GET
H/1.1
|
200
OK
|
userconnect
Show response
ih.adscale.de/
|
95 B
364 B
|
13ms
13ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
2d2bd9ff-2d4d-4318-a5a7-ab2ce9217939.jpg
c.nativendo.de/cdn/asset/media/crt/49476/2/3/
|
28 KB
28 KB
|
22ms
22ms
|
Image
image/jpeg |
2606:4700:20::6819:ac0d
Cloudflare
|
|
|
GET
H2
|
200
|
img;adv=11292203854106;ec=11292203860464;s.a=62339;c.a=3358842;p.a=3972161;a.a=10431592;aaid=;aaid_lat=;idfa=;cache=1572233520
ad.atdmt.com/i/
|
42 B
447 B
|
55ms
39ms
|
Image
image/gif |
2a03:2880:f01c:8004:face:b00c:0:8c
Facebook
|
|
|
GET
H/1.1
|
200
OK
|
1x1.gif
imagesrv.adition.com/
Redirect Chain
-
https://ad2.adfarm1.adition.com/banner?sid=3972161&kid=3358842&bid=10431592&wpt=C&ts=1572233520
-
https://imagesrv.adition.com/1x1.gif
|
68 B
288 B
|
42ms
10ms
|
Image
image/gif |
217.79.188.59
MYLOC-AS
|
|
|
GET
H2
|
200
|
impression.php
t23.intelliad.de/
|
43 B
543 B
|
39ms
16ms
|
Image
image/gif |
3.121.46.7
Amazon.com
|
|
|
GET
H2
|
200
|
a2638715-566b-43f0-a268-c79986ca7154
Show response
t.nativendo.de/cds/tracking/event/
|
0
193 B
|
18ms
17ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 46B2
|
0
57 B
|
16ms
15ms
|
Fetch
image/gif |
216.58.207.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsso7N6Jqhr1dKBk8KoXbMxAu3tVCI8ELyVz0giHfwUOPSa8oXgtigrG3qthl02DE5jiezWX4WVAGcRmpBrTNJV1a7w5RZ-XdFn5YpOCyjA_EurjQGNA1zEC3ChHXHOU2PSsPTvT0oLoi_TicxrOedTBRIFUDan7dch-rKQWN74H3_m0T3575i2dPclnHf3xgPMYXx2-NC70UiY61rdRFItigDfJZ7C0VWqzypfmbFTwhbTxl2lG6X6bi0XX2dGG-Vd1NH75Inlhy4WQiNpMc3BM-Q&sai=AMfl-YQP9mveQpPr7P6lhio3DimK_AbN4aF710FrS1bImROEsmn0pG_XgPLQOD-eD_ePeFidSOWT4jVHvqZ8er9y-eQRdv8BOluR1MSNS7hJsQ&sig=Cg0ArKJSzCDm9Sv5o6lhEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
smb-brand-booster-desktop.js
Show response
media.gamona.de/dfp/
|
13 KB
5 KB
|
47ms
6ms
|
Script
application/javascript |
82.149.242.40
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 46B2
|
77 KB
29 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:818::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_2019102101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 4bb582e7871641e76297261eaae8920a4ea1e5e9b0587cb5f550633b15891c05
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
st
imprammp.taboola.com/
Frame 041A
|
0
0
|
16ms
13ms
|
Document
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=13ADF3AA1C11905619364350650&cicmp=1657475&cijs=1&dast=V7KiYCFgMdfZ6mT0pLeAQdfZ6mT0pLeAUAAAAGBvQHHLFZkGicBYOxYSyWg9VsMZwsJrvBZrNY7KYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQ8G-kBYV-XbZRAWJRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDgBrF2mpClOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugMbLHYLVarM4jJZrSbzA4AAADg7v___18PxHyr0cq0Me4Wzplzs5lNPJPlcrSZGTYmh8lhcW1vqgM3SsLf56JvRFhmv--goJyeHrPLIGO5TAa1QNY0ufwG8UHDsJwMgvlN2GK0mkw2y-FsuZgMhqPhaLQ_gRsNcIKGw8FiN1jsFovhZDEZDZaDBQrEYIITMhxtJqvRbrWbLIeT0Wi2mWyQolWr2WgzGK5mk9lutxoOhsvRCClas5hNJovZaLnbDJaT0WA4GQ4RBofLkWtmc62Vg5VzLZqNdmvhwrhYi1zGkcPk2gxXzt1a9PqYTgubyzYxbFEwQGkvgot0ojld_i6X5a15W9w6p89hEUs0J4t0Irvsa77VaGXaGHcL58y52cwmnslyOdrMDBuTw-SwuPbF4XLkmtlca-Vg5VyLZqPdWrgwLtYil3HkMLk2w5Vztxa9PqbTwuayTQz7xmo3mWw2q8lg31jtJpPNZjUZ7Dt0hu_qczYqb1qFR6e7KX9D0cxpULgMFu9PYlpMu7OD5_c7OlWqi8bYkH0TCrPBYzAoYongdJFORC_j6SKWSJ4W6USymi03vpFzNLPsFrPhzGWbzIyjhXPmWDiMk8VkIpYoTRfpRK97WRyGw-cveDgPD7Nf9DQcPn_Bw3l4mN1iv89pd2v-bp3LaPq8VXeTW_N3i_0uz-mtNFreYr_PaXcLLn-L2eV2WdR_bIjRaK6bzRWD5VwzWCUAAAAAAAAAgCXMmTcBAAAAOA1ksRhMFssFgBBj3SX4lAp5dAJ_K278GGJOl7_LZXlr3ha3zulzWBlAYqcA!&excid=22&tst=1&docw=0&cs=false
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|
GET
H2
|
200
|
cmTagFEED_MANAGER.js
Show response
vidstat.taboola.com/vpaid/units/23_14_13/infra/
|
766 KB
180 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
cmOsUnit.css
vidstat.taboola.com/vpaid/units/23_14_13/assets/css/
|
34 KB
6 KB
|
9ms
8ms
|
Stylesheet
text/css |
151.101.14.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
map
ih.adscale.de/
Frame 1B15
|
0
0
|
63ms
61ms
|
Document
text/html |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
data
lb51.s400.meetrics.net/
|
43 B
308 B
|
1ms
0ms
|
Image
image/gif |
136.243.4.81
HETZNER-AS
|
|
General
- Full URL
- https://lb51.s400.meetrics.net/data?/UN35D+GAAKktFLkqFFlqwF23A52AwwA/k0FMEmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AyyAzzA1yAxwAxyALlnFBUkzFYBPnFAAAAAAABi3DAPBAAFAAi3DTA5iAPBAAAAAkaABA5iAZAAAOA55A55A85B55A58E55A55AFAx1A40AyBErA5iASksFbFjAAAAAAAAAAAAEAAAi3DAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0tBvmFtwEhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0tBvmFtwEhnFlBFdAAAkaAAAAAAAFAAAA5iAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFeWbHUA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.81
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h229.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
vast
Show response
tracking.m6r.eu/sync/
Frame 2209
|
490 B
926 B
|
23ms
23ms
|
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%3Dd6fcea9047%26ref%3Dhttps%253A%252F%252Fwww.giga.de%252Fwebapps%252Fpaypal%252Ftipps%252Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%252F%26ngresponse%3Dtrue%26nu%3D%24%24DMP_SEGMENTS_NUGGAD%24%24%26impid%3D933c6d18-4330-4c6c-960f-f3a9a9729f9d
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
104.109.82.87
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a104-109-82-87.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- 47079d579eae5268b0f9d3d5203624ee9d5e0bf9c58e95156832a91f5e3671a0
|
GET
H/1.1
|
200
OK
|
index.html
media.gamona.de/assets/private-division-the-outer-world/brand-booster/
Frame 9C11
|
0
0
|
6ms
6ms
|
Document
text/html |
82.149.242.40
HGCOMP-ASN
|
|
General
- Full URL
- https://media.gamona.de/assets/private-division-the-outer-world/brand-booster/index.html
- Requested by
- Host: media.gamona.de
URL: https://media.gamona.de/dfp/smb-brand-booster-desktop.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
82.149.242.40
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.6.2 /
- Resource Hash
|
GET
H2
|
200
|
B23388141.258423447;dc_pre=CLKTpKSCvuUCFRgL4AodOTgE3A;dc_trk_aid=454121268;dc_trk_cid=123284344;ord=557630416;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=
ad.doubleclick.net/ddm/trackimp/N915915.2543503STROERMEDIA/
Redirect Chain
-
https://ad.doubleclick.net/ddm/trackimp/N915915.2543503STROERMEDIA/B23388141.258423447;dc_trk_aid=454121268;dc_trk_cid=123284344;ord=557630416;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
-
https://ad.doubleclick.net/ddm/trackimp/N915915.2543503STROERMEDIA/B23388141.258423447;dc_pre=CLKTpKSCvuUCFRgL4AodOTgE3A;dc_trk_aid=454121268;dc_trk_cid=123284344;ord=557630416;dc_lat=;dc_rdid=;tag...
|
42 B
120 B
|
55ms
55ms
|
Image
image/gif |
172.217.21.198
Google LLC
|
|
General
- Full URL
- https://ad.doubleclick.net/ddm/trackimp/N915915.2543503STROERMEDIA/B23388141.258423447;dc_pre=CLKTpKSCvuUCFRgL4AodOTgE3A;dc_trk_aid=454121268;dc_trk_cid=123284344;ord=557630416;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.21.198
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s12-in-f198.1e100.net
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:819::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1447515422&t=event&ni=1&_s=13&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=Paypal-Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=894296220.1572233520&tid=UA-204785-4&_gid=1817368927.1572233520&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cm76=1&z=1718868137
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
93 B
|
5ms
5ms
|
Image
image/gif |
2a00:1450:4001:819::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1447515422&t=event&ni=1&_s=14&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=894296220.1572233520&tid=UA-204785-4&_gid=1817368927.1572233520&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cm76=1&z=1939765249
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::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
|
getAd
Show response
video-adserver.ibillboard.com/
Frame 2209
|
48 B
590 B
|
130ms
130ms
|
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=d6fcea9047&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ngresponse=true&nu=n4%3D2%26n3%3D1&impid=933c6d18-4330-4c6c-960f-f3a9a9729f9d
- 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
|
a2638715-566b-43f0-a268-c79986ca7154
Show response
t.nativendo.de/cds/tracking/event/
|
0
170 B
|
15ms
15ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame E17A
|
0
57 B
|
15ms
14ms
|
Fetch
image/gif |
216.58.207.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuNVkV2eoyg7BHJCRAGePpegtbiCguM57m56m1INycdRNKNfdoAKxlPYqqFhdXvrL9JIXxY1BqhIvp1cl-lapkcHvqwEO16QGm76fsYnmYXZi3gg25xDK-9n3xXueFB3c129n4CotyuFxoFOcNT6yTY14Mdcb5wL7kkOQk3RARquyQ9Nk2SxNPnUaZuboqqrk7DnaGG1QTOY3IkD400OT6piajgWr-BbMl5PqjqjHlsYoN1snziOm3WT8K1odQrXdRzPzgbICwHgbMMp0ZaNXklBmBp74_nIO9-G8Tn&sig=Cg0ArKJSzFx0mldYe95TEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
dcmads.js
Show response
fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754020/dcm/
Frame E17A
|
197 KB
67 KB
|
68ms
32ms
|
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 E17A
|
77 KB
29 KB
|
13ms
13ms
|
Script
text/javascript |
2a00:1450:4001:818::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_2019102101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 4bb582e7871641e76297261eaae8920a4ea1e5e9b0587cb5f550633b15891c05
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 0FF5
|
0
57 B
|
16ms
15ms
|
Fetch
image/gif |
216.58.207.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsucuu4Wy5YsawHdT2vF9FfPTiiBWK-cMAF4DwaIGZf_3XZgoyWX96SCeV0PtZCO7o71qbaxrGbY_RY2vwquB4RUIdsgGNX--8FsjgoJS3Nun2bQrXGaVA5GzpwCf1maHEhBk86g2BupJpcPxRMJn194pkRDODc_O3YSkwNP3lrxJ9JpYPeyWzbKx9JiCADdffOiFtGir8gF1jfc2SZnRMlkP_TVNOzy84mncDd_hb2BFX0s23KSHIWkBDQ1eHunt8pobESa85wraCmyAdrY3-FaWg&sig=Cg0ArKJSzJpszsUj7nQSEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 0FF5
|
77 KB
29 KB
|
13ms
13ms
|
Script
text/javascript |
2a00:1450:4001:818::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_2019102101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 4bb582e7871641e76297261eaae8920a4ea1e5e9b0587cb5f550633b15891c05
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
|
0
123 B
|
14ms
13ms
|
Image
image/gif |
2a00:1450:4001:820::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_sz&r=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&w=160&h=600
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::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
H/1.1
|
200
OK
|
8QU
tracker-adserver.ibillboard.com/error/impid/933c6d18-4330-4c6c-960f-f3a9a9729f9d/iid/272bc1e6-23b1-48a3-9032-1ed56e33ff38/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2...
Frame 2209
|
0
272 B
|
95ms
24ms
|
Image
text/plain |
62.168.44.125
GTSCE GTS Central...
|
|
General
- Full URL
- https://tracker-adserver.ibillboard.com/error/impid/933c6d18-4330-4c6c-960f-f3a9a9729f9d/iid/272bc1e6-23b1-48a3-9032-1ed56e33ff38/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2910a189/adid/85a0d494-5864-4a1e-c578-9fc94f9efa60/sensitive/8QU?erc=303
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.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 2209
|
1 KB
827 B
|
37ms
23ms
|
Script
application/javascript |
2.18.232.7
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
skeleton.js
Show response
static.adsafeprotected.com/
Frame E17A
Redirect Chain
-
https://fw.adsafeprotected.com/rfw/www.googletagservices.com/346702/39754020/dcm/dcmads.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-l...
-
https://static.adsafeprotected.com/skeleton.js
|
17 B
299 B
|
17ms
13ms
|
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 6C41
|
81 KB
20 KB
|
75ms
32ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
H2
|
200
|
teads-format.min.js
Show response
a.teads.tv/media/format/v3/
|
708 KB
184 KB
|
6ms
6ms
|
Script
text/javascript |
2.18.232.7
Akamai Technologies
|
|
|
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 E2F6
|
53 B
642 B
|
10ms
9ms
|
XHR
application/json |
52.219.73.111
Amazon.com
|
|
General
- Full URL
- https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=1378140938
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGF1RmVlc2h1ZWVZYWl5b289YXVGZWVzaHVlZVlhaXlvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5wcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5EdShtKTthLkN1KGwpO2Eua3UoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5MdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXQ9dGhpcy5hWzVdO3RoaXMuTG49dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLnFvPWI7Yi5wcm90b3R5cGU9e1h0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZdDp0aGlzLktuKGEpfSxLbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTG46dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndvOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5GaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMucW98fGhhLHNjPQpuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5YdCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5wcD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuT3QuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5Waj1iO2IucHJvdG90eXBlPXtpdjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTsKdGhpcy5vYlthXSs9MTs1PHRoaXMub2JbYV0mJiF0aGlzLlNnW2FdJiYodGhpcy5TZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLml2KCksITApKX0sb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sb286ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSwKe3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxPdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5OdChhLmRhdGEpfSxOdDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9CkpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sSGc6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbW86ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLk5xKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PQpiLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LE5xOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxjczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9CmFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sb2Y6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOgohMTohMX0sRmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3E9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmUoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYKMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09CnR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eT1rO3U9bTtyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHEsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChxLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7Cm09bSt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihtKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxxPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sWnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxrZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17UWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sJGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCnhyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LHNuOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxhbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LEhtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sWW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5RaSgpfHxhLiRpKCl8fGEueHIoKXx8YS5VbCgpfHxhLnNuKCl8fGEuYWwoKXx8YS5IbSgpfX07cmV0dXJuIG51bGwhPWEuWW8oKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpOwp2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxmcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sVnA6ZnVuY3Rpb24oYSwKYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LGF2OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj0KYX0semc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5DYjt0aGlzLmVlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sUXQ6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJgoxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5mcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGJ2OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9CnRoaXMuWmIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmVlKGEpfSxlZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlF0KGEpO2lmKGIpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKGIpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTWQ6ZnVuY3Rpb24oYSl7aWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLnpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuY3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8CnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMueGcoYSkpcmV0dXJuIHRoaXMueGcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSwKZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnNkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLm1vKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIGw9ZXx8bTtlPSEwO2smJihlPSExKTtpZihsJiZsLlYpaWYobC5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLApjLGwsZyxrKX0uYmluZCh0aGlzKSw1MDApfSxraDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5czpmdW5jdGlvbihhLApiLGQpe3RoaXMua2goYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuT2MpZm9yKHZhciBjIGluIHRoaXMuT2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5PY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5iYihhLGYuTGEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnlzKGYuc2QoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEx1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LFd3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIiwKZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxhcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sWHI6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0KMDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLlZqfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlVqPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuQ3Q9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuS3c9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi55cT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLllmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlFmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuY289e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07CmIuaXc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlVzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnpxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Pdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLk5wPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5mZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTsKYi56Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuWGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLmZvPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5YYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLmVvPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTsKYi5Ycz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnZkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuSnc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZXc9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmZ3PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Xcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5Vanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs2XX1jLnBqPWI7Yi5wcm90b3R5cGU9e0Z2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIGphPWMucGp8fGphLHZjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Gdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLldqPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxsYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sYXI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrCm5hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG5kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5uZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm5kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sa2E6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLmxhKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm5kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxRcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuYXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5uZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9Yy5Xanx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50cD10aGlzLmFbNV07dGhpcy5rbT10aGlzLmFbOF07dGhpcy4kbz10aGlzLmFbN107dGhpcy5OaT10aGlzLmFbOF07dGhpcy4kdz10aGlzLmFbMV07dGhpcy5sdz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs3XX0KYy5ucT1iO2IucHJvdG90eXBlPXtzcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudHA6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmttOnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbzp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmk6dGhpcy5adyhhKX0sWnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR3OnRoaXMua3coYSl9LGt3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMubnF8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLnNwKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CnZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5raj1ifSkoYyk7dmFyIEw9Yy5ranx8Ckw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ249dGhpcy5hWzddO3RoaXMuSGs9dGhpcy5hWzhdO3RoaXMuRXQ9dGhpcy5hWzddO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMub3M9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbN119Yy5SaT1iO2IucHJvdG90eXBlPXtCbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ246dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkhrOnRoaXMuRHQoYSl9LER0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FdDp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubmo6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5SaXx8bGEseGM9bmV3IGxhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLkJuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuZ209TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5NYT17fTt0aGlzLkk9bnVsbDt0aGlzLkxjPTEwMDt0aGlzLkliPTA7dGhpcy5XYT0xNTA7dGhpcy5MYj0wO3RoaXMuRXUoYil9LGc6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhPyh0aGlzLkliKyssdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkxjKSk6MD50aGlzLldhJiYodGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkxjKSl9LHB1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWI+dGhpcy5XYT8hMDohMX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLkliPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKRXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuUCgpLCEwKTt0aGlzLk1hW2IubGEoKV09YjtNJiZNLmhoJiZNLmh2KGIpfSxOeDpmdW5jdGlvbigpe3JldHVybiBlLnllKHRoaXMuTWEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX0sWXI6ZnVuY3Rpb24oYil7Yj1iLkthKCk7Zm9yKHZhciBhIGluIHRoaXMuTWEpaWYoYi5pZD09dGhpcy5NYVthXS5LYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxleTpmdW5jdGlvbihiKXt0aGlzLk1hW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLmdtfHx0OyhmdW5jdGlvbihjKXtjLmltPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9CnRoaXMuaWQ9bnVsbDt0aGlzLkxjPTEwO3RoaXMuSWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubmE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkJiPSIiO3RoaXMucmc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5LYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxNOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30sT3U6ZnVuY3Rpb24oYil7dGhpcy5YPWJ9LE94OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sSHU6ZnVuY3Rpb24oYil7dGhpcy5QZT1ifSxNeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlfSxPZTpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2EmJih0aGlzLkliKyssCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTGMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sRmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sCmxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sZ3k6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMudHIoKXx8dGhpcy5pbygpO3RoaXMuRGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxQeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxpbzpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5hYSgxMCkpfSx0cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sVzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxLYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFZTpmdW5jdGlvbigpe3JldHVybiEwfSwKaXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFh4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmF9LGNhOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMH0sTWM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExoOmZ1bmN0aW9uKGIpe3RoaXMuQmI9Yn0sTHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPQpudWxsfSxSeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuQmImJihiPSEwKTtyZXR1cm4gYn0sYnk6ZnVuY3Rpb24oKXt0aGlzLnJnfHwodGhpcy5yZz0hMCl9LHZlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEl4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLmltfHxwOyhmdW5jdGlvbihjKXtjLnVpPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5JPXRoaXMucGxheWVyPSIiO3RoaXMuTWY9IjEiO3RoaXMuTmY9IjIiO3RoaXMuV249IjMiO3RoaXMuVGM9MDt0aGlzLm9oPTMwO3RoaXMuUmI9W107dGhpcy5oYj1bXTt0aGlzLnBjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLiRmPXRoaXMuZ2k9ITE7dGhpcy5zdGF0dXM9dGhpcy5UYzsKdGhpcy5pZD1lLmFhKDEwKTt0aGlzLmhmKGIpO3RoaXMuRnUoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5naXx8KHRoaXMuZ2k9ITAsZS5NZSgpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmJjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxOcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5rYSgpXXx8KHdpbmRvd1thLmthKCldPXt9KTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldfHwod2luZG93W2Eua2EoKV1bYi5sYSgpXT17fSx3aW5kb3dbYS5rYSgpXVtiLmxhKCldLmluaXRpYXRvcj1lLlpiKCkpO3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT93aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV0rKzp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV09MX0sVnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLAphPSEwLGg9bmV3IEo7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0uaW5pdGlhdG9yIT1lLlpiKCkmJih0aGlzLmpmKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMueGEoKSl7dGhpcy5OcigpO2lmKCF0aGlzLlZyKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmpmKCk7cmV0dXJufXRoaXMuamYoKTt0aGlzLkkodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLiRoKCk7dGhpcy4kZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSx1OmZ1bmN0aW9uKGIsYSl7dGhpcy54YSgpfHwodGhpcy5SYi5wdXNoKGIpLHRoaXMuaGIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5SYiYmMDx0aGlzLlJiLmxlbmd0aCYmKHRoaXMuUmI9CmUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaGIpe2Zvcih2YXIgaD0wO2g8dGhpcy5oYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5oYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5oYltoXS5yZWFzb25dPHRoaXMucGNbYl0mJihhPVtdLGEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksYj10aGlzLmhiW2hdLnJlYXNvbik7dGhpcy5wY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LFF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZ9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxqZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTmZ9LE11OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuV259LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTWZ9LHl4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk5mfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30saGY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxGdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0sWnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxCczpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMudWl8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3A9dGhpcy5hWzZdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuJGs9dGhpcy5hWzZdO3RoaXMuYng9dGhpcy5hWzEwXTt0aGlzLmlxPXRoaXMuYVs2XTsKdGhpcy5kaj10aGlzLmFbOV07dGhpcy5keD10aGlzLmFbOV07dGhpcy5Gcj10aGlzLmFbOF07dGhpcy5mcz10aGlzLmFbM107dGhpcy5Vbz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkdtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3A6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnByOnRoaXMuWmsoYSl9LFprOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy4kazp0aGlzLmF4KGEpfSxheDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYng6dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlxOnRoaXMuY2ooYSl9LGNqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZGo6dGhpcy5jeChhKX0sY3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR4OnRoaXMuRXIoYSl9LEVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gcjp0aGlzLmVzKGEpfSxlczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5mczp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLkdtfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ucCg0KTsoZnVuY3Rpb24oYyl7Yy5Haj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Hanx8b2E7KGZ1bmN0aW9uKGMpe2MuSGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLnp4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPwoodGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuSGp8fHBhOyhmdW5jdGlvbihjKXtjLklqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pOwp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Janx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNxPXRoaXMuYVs5XTt0aGlzLnVzPXRoaXMuYVsxMF07dGhpcy5KbT10aGlzLmFbMTBdO3RoaXMuTXI9dGhpcy5hWzEwXTt0aGlzLmJ3PXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMueWw9YjtiLnByb3RvdHlwZT17QnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNxOnRoaXMudHMoYSl9LHRzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51czp0aGlzLkltKGEpfSxJbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkptOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ncjp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy55bHx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQnEoNCk7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuTXA9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMueWt8fHNhOyhmdW5jdGlvbihjKXtjLnhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UYzt0aGlzLmlzUGxheWluZz10aGlzLlZjPSExO3RoaXMuYmU9MTt0aGlzLldjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlZjPSExO3RoaXMuYmU9MTt0aGlzLldjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5NcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueWQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlZjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5XYy5pbmRleE9mKGEpJiZ0aGlzLldjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuV2MubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LEJzOmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5WY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMueGt8fHRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuV3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5ZcihoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LEt4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFdxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy56a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sdj10aGlzLmFbNV07dGhpcy52aj10aGlzLmFbOV07dGhpcy5TdD10aGlzLmFbNF07dGhpcy5waz10aGlzLmFbMV07dGhpcy51dT10aGlzLmFbMl07dGhpcy5tcz10aGlzLmFbNV07dGhpcy5Caz10aGlzLmFbNF07dGhpcy5tcT10aGlzLmFbMV07dGhpcy51bT10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVszXX1jLndqPWI7Yi5wcm90b3R5cGU9e1F2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Sdjp0aGlzLnVqKGEpfSx1ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmo6dGhpcy5SdChhKX0sUnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlN0OnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wazp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1zOgp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQms6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1xOnRoaXMudG0oYSl9LHRtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMud2p8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlF2KDQpOyhmdW5jdGlvbihjKXtjLm1uPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSwKYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5tbnx8eGE7KGZ1bmN0aW9uKGMpe2MubG49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5GYz10aGlzLkNhPXRoaXMuJGM9ITE7dGhpcy5CaD1lLkhiKDEwKTt0aGlzLmZpPSEwO3RoaXMudWM9dGhpcy5XZz0hMTt0aGlzLlRzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5yaCgpLHRoaXMudnAoKSx0aGlzLnJiKCkpfSxUczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxjeTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkubGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi4kZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkouaWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5pZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkJoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFliOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSmc6ZnVuY3Rpb24oKXtpZighdGhpcy5GYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkZjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5GYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkZjfSxXcjpmdW5jdGlvbigpe2lmKCF0aGlzLlZnKXt2YXIgYj10aGlzLnliKCksYT10aGlzLlVyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5WZz0hMCl9cmV0dXJuIHRoaXMuVmd9LFVyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuJGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLiRjPSEwKTtyZXR1cm4gdGhpcy4kY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlliKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuaHUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksCjIwKX0saHU6ZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3ZhciBiPXRoaXMuSmcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnZjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApfSxKeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmIuYWRzJiYodGhpcy5vZz1iLmFkcyk7cmV0dXJuIHRoaXMub2d9LHZwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2EoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuSmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSw1MCkpfSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuV3IoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5ZYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5ZYigpLHRoaXMudWN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMueWIoKX1lbHNlIHRoaXMuV2c/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCksYj10aGlzLlliKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuV2c9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yaCgpfS5iaW5kKHRoaXMpLAo1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHdwOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud3AoKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5maT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5maSxmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sRHA6ZnVuY3Rpb24oKXt0aGlzLlN4fHwoMTA8dGhpcy53dz8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnd3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMub3UoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRHAoKX0uYmluZCh0aGlzKSwKNTApKSl9LG91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnh3KXt0aGlzLnh3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMubG58fHlhOyhmdW5jdGlvbihjKXtjLm5uPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS55ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpfX0pfSkoYyk7dmFyIHphPWMubm58fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbMTBdO3RoaXMuanA9dGhpcy5hWzRdO3RoaXMuU3I9dGhpcy5hWzZdO3RoaXMuWnM9dGhpcy5hWzVdOwp0aGlzLkFqPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs4XX1jLkx3PWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpwOnRoaXMuUnIoYSl9LFJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Tcjp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnM6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLkx3fHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9QmMuYW4oNCk7KGZ1bmN0aW9uKGMpe2MuWWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxLdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5iYyYmKDA8PWguaW5kZXhPZihkKXx8YS55ZCgpKX0sCnBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKToKd2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuWWx8fENhOyhmdW5jdGlvbihjKXtjLlhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9CjApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5EcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLkRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuS3QoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuWGx8fERhOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLlpsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanQ9dGhpcy5hWzNdO3RoaXMuU3M9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzhdO3RoaXMueHQ9dGhpcy5hWzhdO3RoaXMucmw9dGhpcy5hWzldO3RoaXMubGw9dGhpcy5hWzddO3RoaXMuSW89dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbM119Yy5icT1iO2IucHJvdG90eXBlPXtpdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanQ6dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNzOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wbDp0aGlzLnd0KGEpfSx3dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueHQ6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLmxsOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Jbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuYnF8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLml0KDQpOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkdnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMuTXQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD0KYi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5NdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmxkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5sZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubGQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxDcDpmdW5jdGlvbigpe2UuYmgodGhpcy5sZCk7CmUuRmUodGhpcy5sZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy52a3x8SGE7KGZ1bmN0aW9uKGMpe2MudWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMudWt8fElhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkdnKGIsImVsZW1lbnRJRCIpO2lmKGUuYmgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9ZWxzZSB0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLndrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuQWw9dGhpcy5hWzFdO3RoaXMuSXI9dGhpcy5hWzNdO3RoaXMueHU9dGhpcy5hWzRdO3RoaXMuRHI9dGhpcy5hWzZdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueW49dGhpcy5hWzddO3RoaXMuTW89dGhpcy5hWzVdO3RoaXMuWWs9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzVdfWMueGk9YjtiLnByb3RvdHlwZT17cXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ0OnRoaXMuemwoYSl9LHpsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWw6dGhpcy5IcihhKX0sSHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Jcjp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueHU6dGhpcy5DcihhKX0sQ3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkRyOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLnhuKGEpfSx4bjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW46dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1vOnRoaXMuWGsoYSl9LFhrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMueGl8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnF0KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9CmE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sR3U6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxqbzpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLlhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9bmV3IHooYSkpO3ZhciBjPXRoaXMuZ2I9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTsKaWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5PZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuR3UoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLllqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9CiIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5nYi5zZW5kKGEpfWNhdGNoKGYpe20mJm0uSWUodGhpcy4kYS51cmwpP20uT2Q/bS5pYSgicmVxdWVzdF9mYWlsZWQiKToKZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuWWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17S3U6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxKdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17aXg6IkFkQ2xpY2tUaHJ1IixreDoiQWRFcnJvciIsbHg6IkFkU3RvcHBlZCIsb3g6IkFkTGluZWFyQ2hhbmdlIixweDoiQWRUYWdQYXJzZWQiLHN4OiJBZFZpZGVvQ29tcGxldGUiLAp2eDoiQWRMb2FkZWQiLHd4OiJBZFNraXBwZWQiLHh4OiJBZFN0YXJ0ZWQiLG14OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsbng6IkFkSW1wcmVzc2lvbiIsang6IkFkQ3JlYXRpdmVWaWV3IixxeDoiQWRWaWRlb01pZHBvaW50IixyeDoiQWRQYXVzZWQiLHR4OiJBZFZpZGVvU3RhcnQiLHV4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LGx1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5IYSYmdGhpcy5IYS5WZClmb3IodmFyIGIgaW4gdGhpcy5IYS5WZCl0aGlzLkhhLlZkLmhhc093blByb3BlcnR5KGIpJiYKYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMubXUoKTt0aGlzLkhhJiZ0aGlzLmx1KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuV3A9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9IiI7dGhpcy5laD0hMTt0aGlzLndhPXRoaXMucWQ9IiI7dGhpcy4kZz10aGlzLlY9dGhpcy5pc0VuYWJsZWQ9dGhpcy5hZj0hMTt0aGlzLnBhPVtdO3RoaXMuUGc9dGhpcy5nYz0iIjt0aGlzLnJlPSExO3RoaXMuc2Y9MDt0aGlzLkhmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiOwp0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuS2Q9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5FcD10aGlzLlFkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9dGhpcy53Zj10aGlzLk9kPXRoaXMubGU9dGhpcy5VYz0hMTt0aGlzLmliPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnJkPTA7dGhpcy5SZz0hMTt0aGlzLlFnPTFFMzt0aGlzLmJkPSExO3RoaXMuUWE9MUUzO3RoaXMuUGY9IiJ9Yy5aaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5XcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnFkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZyxzZXJ2ZXI6dGhpcy5wYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlBnLGRpc2FibGVDb29raWVUZXN0OnRoaXMucmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuc2YsSE9NQURfVkVSSUZJRUQ6dGhpcy5IZixIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsCkhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuS2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkVwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk9kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaWIsc2l0ZUNvbmZpZzp0aGlzLkZhLHNlcnZlcklkOnRoaXMuS2gsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmtiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5OaCx2bWFwczp0aGlzLmxpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5iZCxhZEZhbGxiYWNrVVJMOnRoaXMuUGZ9fSwKcnI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxYcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsCmRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmFwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy54Y3x8dGhpcy53Ynx8dGhpcy53Y3x8dGhpcy5qZSkmJihnPXRoaXMuSXMoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ZcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Cmc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LEdjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnBhJiZ0aGlzLnBhLmxlbmd0aCYmMDx0aGlzLnBhLmxlbmd0aCYmKGI9dGhpcy5wYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9CmIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuRXg7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhW3RoaXMuS2hdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxiPXRoaXMuTWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsCmIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEhzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sQz0wO0M8Zy5sZW5ndGg7QysrKXt2YXIgaz1nW0NdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMucGgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj0KdGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LElzOmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkhzKGEsdGhpcy53YykpO3JldHVybiBhfSxCcDpmdW5jdGlvbigpe3RoaXMuRmEmJnRoaXMuRmEuY2xpZW50QVBJcyYmdGhpcy54cCh0aGlzLkZhLmNsaWVudEFQSXMpfSx4cDpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuS3UoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkp1KGEucGxheWVyKTtiLmcoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLAplKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlFkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5CcCgpO3RoaXMueHMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy52cygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSx4czpmdW5jdGlvbigpe3RoaXMuRGEobmV3IHoodGhpcy5xZCt0aGlzLmdlKCJnbG9iYWwiKSksCnRoaXMubHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sdnM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5GYSYmdGhpcy5GYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuRmEmJnRoaXMuRmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxpYTpmdW5jdGlvbihhKXtpZighdGhpcy5sZSl7dGhpcy5sZT0hMDsKdmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiYKYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpO3RoaXMuTmIoKTtlLkNjKGsuQ3QpOyhiPWUuJGIodGhpcy5zZCgpKSl8fChiPWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGxyOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPQp7fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy53YX1lbHNlIGE9dGhpcy53YTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGEuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLnBhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09CnRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuS2g9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMucGEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5nYyYmdGhpcy5MYSYmdGhpcy5wYS5sZW5ndGg/dGhpcy5IYyghMSk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPQohMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTt0aGlzLkRhKGIsdGhpcy5rdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY3VzdG9tZXIiKTthP3RoaXMuRG0/dGhpcy5pYSgibm9TVk1Db25maWciKToodGhpcy5EbT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGMoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxrdjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5PZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5pYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmtjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuS2Q9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnhjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMud2I9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuY2Q9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYmQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5lcihiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMucmUmJih0aGlzLmhjPW51bGwpO3RoaXMudGY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuSHYoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuS2QpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy5ydigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnN2KCkpfX0scnY6ZnVuY3Rpb24oKXt0aGlzLnF2KCk7dGhpcy50digpfSx0djpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmEoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5rZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuVmEoKSl7aWYodGhpcy5GYSYmdGhpcy5GYS5wbGF5ZXImJnRoaXMuRmEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7CnJldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxzdjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5VYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSxxdjpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUua2QoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmljKTsKYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy53dihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlBjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5LZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sd3Y6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMueHYoYywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSx4djpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1jO2sub25lcnJvcj1lO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy5wdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHB2OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5UaCgpOnRoaXMucWYoIkFBQSIpfSxUaDpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpOwp0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVWMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuSGYpKTt0aGlzLlFkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuUWQmJnRoaXMuUWQoKX0sQXA6ZnVuY3Rpb24oKXtpZih0aGlzLndmJiYKdGhpcy5ycigpKXt2YXIgYT10aGlzLlhxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnJkfHwodGhpcy5yZD0wKTt0aGlzLnJkKys7dGhpcy5yZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2MmJihhLm9pPSEwKTtxJiZlLlpyKCkmJihhLkJnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSx5cDpmdW5jdGlvbigpe2UuVmEoKXx8ZS5iYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuR2MoKXx8KGE9dGhpcy56YShjKSxjPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7Zy5uZXR3b3JrU3RhdGU9PQpnLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxudjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5saX0senA6ZnVuY3Rpb24oKXt0aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMuaHcuYmluZCh0aGlzKSx0aGlzLmd3LmJpbmQodGhpcykpfSxodzpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuQXEoKX0sZ3c6ZnVuY3Rpb24oKXt9LEFxOmZ1bmN0aW9uKCl7ZS5DYyhrLnpxKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmlhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxuZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuSmIubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxIdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxlcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPQphLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLlpqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5mcD10aGlzLmFbMl07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaGo9CnRoaXMuYVsxXTt0aGlzLmh0PXRoaXMuYVs4XTt0aGlzLmhzPXRoaXMuYVs1XTt0aGlzLlhtPXRoaXMuYVs3XTt0aGlzLlZ2PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzhdfWMuT2w9YjtiLnByb3RvdHlwZT17ZXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZwOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tbzp0aGlzLmdqKGEpfSxnajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaGo6dGhpcy5ndChhKX0sZ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmh0OnRoaXMuZ3MoYSl9LGdzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oczp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWG06dGhpcy5VdihhKX0sVXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5PbHx8UGEsRWM9bmV3IFBhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmVwKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy4kdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy5hZD0hMTt0aGlzLlhvPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307ZS5wYigibmV3QmlnQWRJZCIpO3RoaXMua3A9ZS5hYSgxMCk7dGhpcy5tZj0wO3RoaXMuWmM9IldlcmJ1bmcgLSBbdGltZV0iOwpjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWmM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWmM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMucG89Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkdkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5iYz0hMTt0aGlzLk9wPWUuYWEoMTApO3RoaXMuR2I9ZS5hYSgxMCk7dGhpcy5FYj1lLmFhKDEwKTt0aGlzLk9oPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLlJkPXRoaXMuT2I9dGhpcy5wZT10aGlzLmdkPXRoaXMuSWQ9CnRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubWQ9dGhpcy5Ldj10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLnhkPXt9fWMuVGo9YjtiLnByb3RvdHlwZT17QnU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLmR2KCk7ZS52KGsuZm8sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTGU6ZnVuY3Rpb24oYSxiLGMsZil7dGhpcy51Yj1jO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5BcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLG5ldyBTKHRoaXMsYSx0aGlzLm1oLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLm1jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5RYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLApjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUmQ9dGhpcy5PYj10aGlzLm1kPSExO3RoaXMuYz1hO3RoaXMuUHUodGhpcy5jKTt0aGlzLnhkPW5ldyBRYSh0aGlzLmMubncsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5IcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5IZD10aGlzLmhyKGEpKSx0aGlzLk1nKGEucGFyZW50KSl9LERnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YKYnx8KGM9dGhpcy5EZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLlNxKGEpKSk7cmV0dXJuIGN9LFNxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxocjpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxnPSIiO2lmKGEuVSl7Yj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEubGIoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpnfX0sc2E6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBiPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLmpkJiZhLmpkLmVycm9yJiZhLmpkLmVycm9yLmNvZGUmJihiPWEuamQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PQpHLlhkLmNvZGU/ZS52KGsuS3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5NZSgpLGI9PUcuS2YuY29kZSYmZS52KGsuVXMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk7ZS52KGsueXEsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmV2KCk7dGhpcy5YYSgiZW1wdHkiKTticmVhaztjYXNlIHcuSWYuY29kZTplLnYoay5pdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LkxmLmNvZGU6ZS52KGsuT3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuWWQuY29kZTplLnYoay5Qdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6ZS52KGsuVnMsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLmV3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5FZi5jb2RlOmUudihrLmZ3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLlhiKGEpO3RoaXMuUmEoKX0sWGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5LZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sUHU6ZnVuY3Rpb24oYSl7dGhpcy5wZT0hMTt0aGlzLlBiPQp0aGlzLmIuSzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5QYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuJGU9ITB9Y2F0Y2goZil7fX1jYXRjaChlKXt9Yi5keT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsCnRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTt0aGlzLnBvJiZ0aGlzLnBsYXllci52ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuTy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5PW2NdLnR5cGUpJiZ0aGlzLmtvKGIsYS5PW2NdLnVybCsiIixhLk9bY10udHlwZSk7dGhpcy4kZSYmYi5sb2FkKCk7aWYodGhpcy5YaChiKSl7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5ubyhiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7CnRyeXt0aGlzLiRlP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2goayl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5LcCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuTnUoKSk6dGhpcy5jLm9yaWdpbi51Zyh3LlVkKX0sTnU6ZnVuY3Rpb24oKXt0aGlzLkNmPSEwO3RoaXMuc2I9dGhpcy5uYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLm1nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5zYj0hMCk7ZS5vZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmCmUub28odGhpcy5jLm9yaWdpbi52YSk7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9RS5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi53aCgpO3RoaXMuYi5rZigpO2ZvcihhPXRoaXMuYi5LO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIua2YoKTt0aGlzLnRhPXRoaXMuUGI9dGhpcy5iLks7dGhpcy5oaSgidnBhaWQiKTtpZih0aGlzLnNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuS2IoIm11dGVkIiwiY29udGVudCIpO2UudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5LLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmtyKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmRnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5oZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJiF0aGlzLklkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay56YywKdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuYWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuc2M9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy55dyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnp3KCksdGhpcy5iLmFjKCEwKSwhdGhpcy5PYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy5ILApjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuR2UodGhpcy5PYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmFjKCEwKSx0aGlzLkR3KCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5IdygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5GdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkl3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkV3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm1pKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5WYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkwuYmR8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5RYyYmKHRoaXMuRGY9ITEsdGhpcy5mYygpKSx0aGlzLkJ3KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuc2I9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay52ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5zYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmhlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLmFnKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5ILCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sQXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLm5jPSEwfSxCdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlhjLHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubmM9ITF9LER3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sQ3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5RaCgpO2UudihrLlRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLlhjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubWQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlFmLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxHdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5WZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxJdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbWk6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7CmUub2UoKTt0aGlzLkg9ITE7dGhpcy5SYShhKX19LHl3OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5Kdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubWkoITApfSxrbzpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuR2MoKSl7dmFyIGQ9Yi56YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuc3cuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmMoYix0aGlzLkwpKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LG5vOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmlpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmppLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmppLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0saWk6ZnVuY3Rpb24oYSl7dGhpcy5XYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldifHx0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuWG8pKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWQmJnRoaXMuWGgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5XYil7dGhpcy5hZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5aYSgpLCEwKSx0aGlzLkwudGd8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLnB3KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIua2YoKTt0aGlzLm93KCk7dGhpcy5oaSgpO3RoaXMuZWcoKTt0aGlzLmIud2goKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMubmYoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nZHx8dGhpcy5SZigpfSxSZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmdkfHwoYT90aGlzLlJhKCk6KHRoaXMuUWUoITApLHRoaXMuUmYoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmVjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkxoKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuTC5rYiYmIXRoaXMuRmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5jbyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuUmEoKX0saG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9ITEsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9ZS5IZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQSgpKTtlLmJ2KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJgp0aGlzLmMuU2QmJnRoaXMuaG8odGhpcy5jLlNkKTtpZighdGhpcy5wZSlpZih0aGlzLnBlPSEwLHRoaXMuUmR8fChlLnYoay5Ycyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy50Ynx8dGhpcy5jLnFjKXtlLnBiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm1mKys7dGhpcy5XYj10aGlzLmFkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5HZD0hMTt0cnl7dGhpcy5iLmVpKCl9Y2F0Y2goZyl7fXRoaXMuSWQ9ITA7dGhpcy5iLkJlKCk7dGhpcy5iYz0hMTt0aGlzLnhlKCkuR2goKTt0aGlzLmMudGImJnRoaXMuYy5vcmlnaW4uUmUoKTt0aGlzLmMucWMmJihhP3RoaXMuYy5vcmlnaW4ucWgoKToKdGhpcy5xZSgpKX1lbHNlIHRoaXMucWUoKX0sc3c6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5XYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkwueXAoKTt0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxqaTpmdW5jdGlvbigpe2lmKHRoaXMuS3YpdGhpcy5SYSgpO2Vsc2V7dGhpcy5iYz0hMDt0aGlzLmIuZi5BYSYmIXRoaXMuSWQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dmFyIGE9Ck1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5OdihhKTtpZighdGhpcy5PYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5SZD0hMDtlLnYoay5raSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5sZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PaCkpJiYoYz10aGlzLmMubGYtCmEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy50Yj8odGhpcy5XYj10aGlzLmFkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5HZD0hMSx0aGlzLmIuZWkoKSx0aGlzLmMub3JpZ2luLlJlKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWmMucmVwbGFjZSgiW3RpbWVdIiwKZS5DZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmZlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxiaTpmdW5jdGlvbigpe3RoaXMudmh8fCh0aGlzLnZoPSEwLHRoaXMubWR8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxOdjpmdW5jdGlvbihhKXtlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuY2l8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYmkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5RaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLAp0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5rYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5UZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMubWQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLnYoay5RZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5jaT1hKX0sUGg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsYiwhMCl9LGR2OmZ1bmN0aW9uKCl7ZS5NZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxRaDpmdW5jdGlvbigpe2UuTWQoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0sZXY6ZnVuY3Rpb24oKXtlLk1kKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sClhhOmZ1bmN0aW9uKGEpe2UuTWQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuTC5rYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxLYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5rYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkZiKXt0aGlzLnhkJiZ0aGlzLnhkLnRyYWNrJiZ0aGlzLnhkLnRyYWNrKGEpO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLmlyKHRoaXMuYy5QYSxhKX1jYXRjaChmKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgZz1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmCih0aGlzLmtlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmUuWHIoZy51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZW8sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLktlKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmMuUGE9dGhpcy5VcCh0aGlzLmMuUGEsYSl9Y2F0Y2gobSl7fX19LFphOmZ1bmN0aW9uKCl7dmFyIGE9ZS5WYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixiPSIiO3RoaXMuQ2YmJihiPSJfdnBhaWQiKTt0aGlzLlFjJiYoYj0iX3dlbGVjdCIpO3JldHVybiBhK2J9LEtlOmZ1bmN0aW9uKGEsYixjLGYsZSl7YSYmInN0cmluZyI9PQp0eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxjJiZiLmpvKGMpLGZ8fChmPXRoaXMuc2cpLGV8fChlPXRoaXMuc2cpLHRoaXMubG8oYSksdGhpcy5MLkRhKGIsZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGxvOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09Im9wZW4ifSxGaDpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJjbG9zZWQifSxIcDpmdW5jdGlvbigpe3RoaXMuZGM9e319LGd2OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuZGMpdGhpcy5kYy5oYXNPd25Qcm9wZXJ0eShiKSYmIm9wZW4iPT10aGlzLmRjW2JdJiZhKys7cmV0dXJuIGF9LGlyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sVXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpifSl9LHB3OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5xdy5iaW5kKHRoaXMpKX0scXc6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmZjKCk6dGhpcy5jLlZiJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5MLmJkfHx0aGlzLlFjKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLlZifWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYy5WYixhKX19LmJpbmQodGhpcyksNTAwKSl9LApvdzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlpjLnJlcGxhY2UoIlt0aW1lXSIsZS5DZygwKSk7CnZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5jZCYmKGI9dGhpcy5MLmNkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5jZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sRWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5jZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGhpOmZ1bmN0aW9uKGEpe2lmKCFlLm9mKHRoaXMuY29udHJvbHMpKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpjLmlkPXRoaXMuT3A7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuR2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkViO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Ndi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkx2LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk9oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmMuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmxmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXt0aGlzLkJhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLm1nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGZjOmZ1bmN0aW9uKCl7dGhpcy5CYSYmImJsb2NrIj09dGhpcy5CYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxZaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuWGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxaaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMubmM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLm5jPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLm5jPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5YYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LEx2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxNdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuc2I/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5zYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMuc2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSwkdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmVjKTt0aGlzLmdkfHx0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0scWU6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUua2QoKTshdGhpcy5MLm1jfHxlLlZhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5rZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy50aHx8IXRoaXMuTC5VYyYmInNwaWVnZWwuZGUiIT1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwicHJlcm9sbCIhPWUuQ2I/KHRoaXMuZ2Q9ITAsdGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy5uZygpKToodGhpcy50aD10aGlzLlFjPXRoaXMuRGY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5rZT0hMCxhPWUuZGcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuTGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuZ3YoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy5JZD0hMCx0aGlzLmIuQmUoKSx0aGlzLmIucXUoKSx0aGlzLmJjPSExLAplLnYoay5OcCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMueGUoKS5HaCgpKX0seGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZWc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZS5GZSh0aGlzLnZpZGVvLGEpP3RoaXMuSWgoKTp0aGlzLnlkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVmIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5zYyYmMDx0aGlzLnNjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5zYykpO3RoaXMudmlkZW8mJgp0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMua3ArIi0iK3RoaXMubWY7dGhpcy5jJiZ0aGlzLmMuSWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLklnKCkpO3JldHVybiBhfSxzZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuVGp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRwPXRoaXMuYVsyXTt0aGlzLm50PXRoaXMuYVs4XTt0aGlzLll3PXRoaXMuYVsxXTt0aGlzLm5rPXRoaXMuYVsxMF07dGhpcy5raz10aGlzLmFbNV07dGhpcy5Vbj10aGlzLmFbNV07dGhpcy5Bbj10aGlzLmFbNl07dGhpcy5lbj10aGlzLmFbMV07dGhpcy52cj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLkJpPWI7Yi5wcm90b3R5cGU9CntTcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVHA6dGhpcy5tdChhKX0sbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm50OnRoaXMuWHcoYSl9LFh3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Zdzp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubms6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmtrOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Vbjp0aGlzLnpuKGEpfSx6bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQW46dGhpcy5kbihhKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVuOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuQml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5TcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkdhPW51bGw7dGhpcy5ZPVtdO3RoaXMuVT1udWxsO3RoaXMucmM9dGhpcy50Yz0hMTt0aGlzLnZhPSIiO3RoaXMuQmY9ITE7dGhpcy5UZz0iIjtkJiZkLmVtcHR5P3RoaXMuQXMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5rbj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5rZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPQohMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bS55YShtLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVmEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlKXthPWUucGcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uSmQoYSkpKyImdHlwZT1qcyIsYj1tLnlhKG0uSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0ueWEobS5KZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnpzLmJpbmQodGhpcyksdGhpcy53cy5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkdhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5DYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuQ2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkNifHx0aGlzLmJzKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLm52KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGJzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0senM6ZnVuY3Rpb24oYSl7dGhpcy5adChhKTt0cnl7dGhpcy5HYT1hLnJlc3BvbnNlWE1MLHRoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOgpHLkpmfSkpfSxBczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWWQpKX10aGlzLlk9dGhpcy5FZygpO3RoaXMudGM9dGhpcy5yZigpO3RoaXMucmM9dGhpcy5VaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5KYygpOnRoaXMuc2EodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkJmP0cuWGQ6Ry5KZn0pKX0sd3M6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5JZix7ZGVwdGg6YX0pKX0sSmM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5kcygpP3RoaXMueXYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMuUnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMuY3coKSYmdGhpcy5XZSh0aGlzLlJwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPwoodGhpcy50Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5SZSgpfSxxaDpmdW5jdGlvbigpe3RoaXMucmM/KHRoaXMucmM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSmMoKSk6dGhpcy5wYXJlbnQucWgoKX0sY3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52digpP3RoaXMudXYoKT8hMDooLTEhPXRoaXMuRGMoKT90aGlzLnNhKHRoaXMuU2Eody5UZCkpOnRoaXMuc2EodGhpcy5TYSh3LkVmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5TYyxHLktmKSksITEpfSxXZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5TZHx8KGEuU2Q9W10pO2EuU2QucHVzaCh0aGlzLlRnKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuQWc7dGhpcy5wYXJlbnQuV2UoYSl9LFJwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuRGMoKTthLk89dGhpcy5LZygpO2EuVmI9dGhpcy5UcSgpO2Eubnc9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5RcSgpO2EubGY9dGhpcy5ncihhLmR1cmF0aW9uKTthLmFiPWEuYWI/YS5hYjotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuQWc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLmFiPWIuYWI/Yi5hYjotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuQWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlVxKCkpOmIuUGEuY29uY2F0KHRoaXMuYnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5YYiYmdGhpcy5wYXJlbnQuWGIoYiksYT0wLHRoaXMuSmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxYYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5YYihhKX0sdWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30seXY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSx2djpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuS2coKS5sZW5ndGh9LHV2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSxVaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxadDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuQmY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sZHM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk5nKCkubGVuZ3RofSxOZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LFJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5sYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuYWgoYS5wYXJlbnROb2RlKTohMX0sYnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sVXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFRxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxGeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5wZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxncjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLmF2KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5wZChhKToiIn0scGQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLmtufHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp2PXRoaXMuYVs1XTt0aGlzLm5tPXRoaXMuYVsxXTt0aGlzLmlsPXRoaXMuYVs4XTt0aGlzLnhsPXRoaXMuYVs3XTt0aGlzLlJ3PXRoaXMuYVsxMF07dGhpcy5ObD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLlBxPWI7Yi5wcm90b3R5cGU9e0l2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kdjp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlsOnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54bDoKdGhpcy5RdyhhKX0sUXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJ3OnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlBxfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Jdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5mbT1iO2IucHJvdG90eXBlPXtLcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSwkcTpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy4kcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sa3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmZtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5UaT10aGlzLmFbOF07dGhpcy5Paz10aGlzLmFbOV07dGhpcy5lbT0KdGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzZdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuZ2s9dGhpcy5hWzRdO3RoaXMuenQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5adj1iO2IucHJvdG90eXBlPXtTaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVGk6dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk9rOnRoaXMuZG0oYSl9LGRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbTp0aGlzLkN2KGEpfSxDdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHY6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nazp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlp2fHxXYSxIYz1uZXcgV2EoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuU2koNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApneDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGh4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlB2PXRoaXMuYVs4XTt0aGlzLlZtPXRoaXMuYVs3XTt0aGlzLkRvPXRoaXMuYVsxMF07dGhpcy5QaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLkV2PWI7Yi5wcm90b3R5cGU9e092OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qdjp0aGlzLlVtKGEpfSxVbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm06dGhpcy5DbyhhKX0sQ286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkRvOnRoaXMuT2koYSl9LE9pOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuRXZ8fFhhLEljPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk92KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj0KYTt0aGlzLmpkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuRmo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkZqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KaT10aGlzLmFbMV07dGhpcy5VdD10aGlzLmFbN107dGhpcy53aT10aGlzLmFbMV07dGhpcy5jbT10aGlzLmFbNl07dGhpcy5VdT10aGlzLmFbNl07dGhpcy5HbD10aGlzLmFbMTBdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuUHI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy54bT1iO2IucHJvdG90eXBlPXtJaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSmk6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdDp0aGlzLnZpKGEpfSx2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5ibShhKX0sYm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5jbTp0aGlzLlR1KGEpfSxUdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXU6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdsOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50azp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUHI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLnhtfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5JaSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSGg9YTt0aGlzLnZpZGVvPWI7dGhpcy5QZD1bXTt0aGlzLkVoPVtdO3RoaXMuU2U9W107dGhpcy5ydz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLmpsPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLiR4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm51LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmZ1LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwpsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuUGQucHVzaCh7c3JjOmMsZnJhbWU6ZyxCdDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5TZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlNlW2JdO2MudHlwZT09PWEmJmMudXAodGhpcy5WcShhKSl9fSxWcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpeTohMCxoeTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntXeDoidmlkZW8iLGt5OiJqc0N1c3RvbSIsbHk6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbXk6MSxHeDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LGpyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5QZC5sZW5ndGg7YisrKWlmKHRoaXMuUGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5QZFtiXS5CdDtyZXR1cm4iIn0sbnU6ZnVuY3Rpb24oYSxiKXt0aGlzLkVoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLmpyKGIpLHZlbmRvcjpifSk7CnRoaXMuY3YoKX0sZnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnJ3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSx1cDpiLGZ5OiExfSl9LGN2OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS4kcnx8KGEuWngoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmp5LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS4kcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5qbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmo9dGhpcy5hWzEwXTt0aGlzLm5sPXRoaXMuYVsxXTt0aGlzLlNrPQp0aGlzLmFbNV07dGhpcy5Ecz10aGlzLmFbNV07dGhpcy5ncT10aGlzLmFbMl07dGhpcy52bD10aGlzLmFbM107dGhpcy5zbT10aGlzLmFbMl07dGhpcy5DbT10aGlzLmFbM107dGhpcy5Tbj10aGlzLmFbNF07dGhpcy5Raz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLkdzPWI7Yi5wcm90b3R5cGU9e2FqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5iajp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmw6dGhpcy5SayhhKX0sUms6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNrOnRoaXMuQ3MoYSl9LENzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy51bChhKX0sdWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52bDp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNtOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuQ206dGhpcy5SbihhKX0sUm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNuOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Razp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuR3N8fFphLEtjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLmFqKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMuZj1hO3RoaXMuamI9YS5GZygpO3RoaXMuSz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLksuaWQ9ZS5hYSgxMCk7dGhpcy5GPUUucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5jZz0hMTt0aGlzLlRiPVtdfWMub2o9YjtiLnByb3RvdHlwZT17T3E6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5PcShhKTtmb3IodmFyIGI9MCxjPTAsZT0hMSxnPXRoaXMud3IoYSksaz17fTthOyliKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGp2OmZ1bmN0aW9uKCl7dGhpcy5jZz0hMH0sZWk6ZnVuY3Rpb24oKXt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LAp3aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLnpjLHRoaXMuZi5zKCkpfSxxdTpmdW5jdGlvbigpe3RoaXMuY2d8fCh0aGlzLmYucGxheSgpLGUudihrLmZkLHRoaXMuZi5zKCkpKX0sa2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuSy5zdHlsZS56SW5kZXg9YTt0aGlzLksuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5LLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLksuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLksuc3R5bGUuYm94U2l6aW5nPXRoaXMuamIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSy5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PXRoaXMuamIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5qYik7dGhpcy5mLk1jJiZ0aGlzLmYuTWMoKT90aGlzLmYuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5LKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSx3cjpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGImJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sSXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249CmIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sYWM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JcSh0aGlzLmpiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkJlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5NYygpPyh0aGlzLksuc3R5bGUubGVmdD0iMHB4Iix0aGlzLksuc3R5bGUudG9wPSIwcHgiKToodGhpcy5LLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5LLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5LLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KwoicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLm9mKHRoaXMuSykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGFnOmZ1bmN0aW9uKGEpe3RoaXMuVGJ8fCh0aGlzLlRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5UYi5wdXNoKGEpfSxCZTpmdW5jdGlvbigpe3RoaXMuSyYmdGhpcy5LLnBhcmVudE5vZGUmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkspO3RoaXMuRiYmdGhpcy5GLnBhdXNlJiZ0aGlzLkYucGF1c2UoKX19fSkoYyk7Zm9yKHZhciAkYT1jLm9qfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtFLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FbD10aGlzLmFbN107dGhpcy54cT10aGlzLmFbMV07dGhpcy55bz10aGlzLmFbMV07dGhpcy5MbD10aGlzLmFbNF07dGhpcy5ycT10aGlzLmFbM107dGhpcy5Odz10aGlzLmFbMl07dGhpcy5Hbz10aGlzLmFbMV07dGhpcy5haz10aGlzLmFbNF07dGhpcy51bj10aGlzLmFbNl07dGhpcy5qPQp0aGlzLmFbMl19Yy5ocD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWw6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhxOnRoaXMueG8oYSl9LHhvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55bzp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGw6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJxOnRoaXMuTXcoYSl9LE13OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Odzp0aGlzLkZvKGEpfSxGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR286dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFrOnRoaXMudG4oYSl9LHRuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJiPWMuaHB8fGJiLExjPQpuZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5EbCg0KTsoZnVuY3Rpb24oYyl7Yy5TbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5XKGEpO3RoaXMuRGQoYik7dGhpcy5xZygpfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0scWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkthKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLAphP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sRWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5LYSgpOwppZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLlNsfHxjYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuVWY9dGhpcy5XZj10aGlzLlhnPXRoaXMuZWE9dGhpcy51Zj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkVxKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51Zj0hMDt0aGlzLlhnJiZ0aGlzLmtnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsCiJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJmEuYmMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuWGc9ITA7dGhpcy5rZygpfS5iaW5kKHRoaXMpKTt0aGlzLmdnKCl9LGtnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Ipe3RoaXMuZGQoKTtpZighdGhpcy51ZiYmIXRoaXMuZGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnVmJiZ0aGlzLlVmJiYhdGhpcy5XZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGRkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpOwpyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sTGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sZ2c6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPXRoaXMuTGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5XZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlVmPWIuRHh9dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSxIeDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5VeCgpOiExfSxEYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkRjKCk6LTF9LGNyOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LEVxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlNifHwzMDI9PXRoaXMuU2I/dGhpcy5lYT0hMDp0aGlzLnUoImFkZXJyb3IiLHRoaXMuU2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOmIuRWUoKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5jcihiKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksCjJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy5SbHx8ZGI7KGZ1bmN0aW9uKGMpe2MuVGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxhczpmdW5jdGlvbigpe3dpbmRvdy5PTy5sbS5Ybi5Wbj93aW5kb3cuT08ubG0uWG4uVm4uQngoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYXMoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS55ZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgY2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IGRiKGMsCnRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy5UbHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ0PXRoaXMuYVs1XTt0aGlzLnZ3PXRoaXMuYVs4XTt0aGlzLllwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzhdfWMuYXE9YjtiLnByb3RvdHlwZT17YXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJ0OnRoaXMudXcoYSl9LHV3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52dzp0aGlzLlhwKGEpfSxYcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWXA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLmFxfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuYXQoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLnpoKCl9LHpoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ZaXx8aGI7KGZ1bmN0aW9uKGMpe2MuWGk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0saGc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucmEoKTp0aGlzLm0oKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuaGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sQ2g6ZnVuY3Rpb24oYil7Yj1uZXcgaGIoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fChiLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlIoYiksKG5ldyBpYihiLHRoaXMuSSkpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZxfHwodGhpcy5GcT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuQ2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkNoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7CnRoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuWml8fGpiLFQ9bmV3IGpiKHIpO1QuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZ3PXRoaXMuYVsxXTt0aGlzLlFsPXRoaXMuYVsxXTt0aGlzLnFzPXRoaXMuYVs2XTt0aGlzLkF2PXRoaXMuYVsxMF07dGhpcy5paz10aGlzLmFbMV07dGhpcy5ycD10aGlzLmFbOV07dGhpcy5idT10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLkFpPWI7Yi5wcm90b3R5cGU9e1V3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Wdzp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFsOnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xczp0aGlzLnp2KGEpfSx6djpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQXY6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5pazp0aGlzLnFwKGEpfSxxcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJwOnRoaXMuYXUoYSl9LGF1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5idTp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkFpfHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5Vdyg0KTsoZnVuY3Rpb24oYyl7Yy5ObT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuTm18fFU7KGZ1bmN0aW9uKGMpe2MuTW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guWWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlljKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuJHMoYSl9LmJpbmQodGhpcykpO3guWWMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5ZYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3gucXIoKX0sJHM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwKMzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLk1tfHxWOyhmdW5jdGlvbihjKXtjLk9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTsKdGhpcy53ZCYmKGI9ZS5WcChiLHRoaXMud2QpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLndkfHwodGhpcy53ZD1bXSksdGhpcy53ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWWM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8Cih0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LEJ2OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5wdSgpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxxcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9CmEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5CdihiKX19KX0pKGMpO3ZhciBsYj1jLk9tfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpuPXRoaXMuYVsxXTt0aGlzLldrPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMudHc9YjtiLnByb3RvdHlwZT17aG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuVmsoYSl9LFZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuV2s6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYj1jLnR3fHxtYixPYz1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy5obig0KTsoZnVuY3Rpb24oYyl7Yy5VaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxBYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuVWl8fG5iOyhmdW5jdGlvbihjKXtjLlZpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMudSgibm9BZCIsInBsYXllZCIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLlZpfHxvYjsoZnVuY3Rpb24oYyl7Yy5XaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpOwppZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBuYihkKTt0aGlzLk4oZyl8fCh0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLldpfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1wPXRoaXMuYVs1XTt0aGlzLmVxPXRoaXMuYVs3XTt0aGlzLkp0PXRoaXMuYVs0XTt0aGlzLlVrPXRoaXMuYVs2XTt0aGlzLmduPXRoaXMuYVs4XTt0aGlzLndtPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuUXU9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1wOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lcTp0aGlzLkl0KGEpfSxJdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSnQ6dGhpcy5UayhhKX0sVGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVrOnRoaXMuZm4oYSl9LGZuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbjp0aGlzLnZtKGEpfSx2bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj0KYy5RdXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMubHAoNCk7KGZ1bmN0aW9uKGMpe2MuSWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuZXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZXU6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJgphLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFlnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuSWx8fHNiOyhmdW5jdGlvbihjKXtjLkhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLkhsfHx0YjsoZnVuY3Rpb24oYyl7Yy5KbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9CmwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5KbHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZmo9dGhpcy5hWzddO3RoaXMuUHM9dGhpcy5hWzNdO3RoaXMuc3U9dGhpcy5hWzZdO3RoaXMuZng9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy5Hcj1iO2IucHJvdG90eXBlPXtlajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmo6dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBzOgp0aGlzLnJ1KGEpfSxydTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnN1OnRoaXMuZXgoYSl9LGV4OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5meDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuR3J8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmVqKDQpOyhmdW5jdGlvbihjKXtjLnFuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMucW58fAp3YjsoZnVuY3Rpb24oYyl7Yy5wbj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxZYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sY3U6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5jdSh0aGlzLkNhKToodGhpcy5DYT10aGlzLlliKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpO3JldHVybn1pZighdGhpcy51Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZiLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmZiW2FdJiYzMDMhPXRoaXMuZmJbYV0mJjQwMyE9dGhpcy5mYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKNTAwKX19KX0pKGMpO3ZhciB4Yj1jLnBufHx4YjsoZnVuY3Rpb24oYyl7Yy5ybj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMucm58fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MbT10aGlzLmFbMV07dGhpcy5HcD10aGlzLmFbMV07dGhpcy5SbT10aGlzLmFbOV07dGhpcy5Rbj10aGlzLmFbOV07CnRoaXMua3E9dGhpcy5hWzEwXTt0aGlzLnp1PXRoaXMuYVs2XTt0aGlzLnVvPXRoaXMuYVsyXTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzJdfWMuY249YjtiLnByb3RvdHlwZT17S206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxtOnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HcDp0aGlzLlFtKGEpfSxRbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUm06dGhpcy5QbihhKX0sUG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlFuOnRoaXMuanEoYSl9LGpxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcTp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuenU6dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVvOnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT8KdGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLmNufHxBYixSYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5LbSg0KTsoZnVuY3Rpb24oYyl7Yy56bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5YZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuTHQoKX0uYmluZCh0aGlzKSw1MDApfSxMdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJgphJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5YZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5YZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxmdjpmdW5jdGlvbigpe3RoaXMuWGU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBCYj1jLnptfHxCYjsoZnVuY3Rpb24oYyl7Yy55bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubGM9MH0sZzpmdW5jdGlvbigpe3RoaXMuRnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmxjfHwodGhpcy5sYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5sY3x8dGhpcy5sYysrLHRoaXMubGM8PXRoaXMuRnM/KHRoaXMubGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLmZ2KCksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBDYj1jLnltfHxDYjsoZnVuY3Rpb24oYyl7Yy5BbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgQ2IoYix0aGlzLkkpKS5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBEYj1jLkFtfHxEYixFYj1uZXcgRGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnE9dGhpcy5hWzZdO3RoaXMubHQ9dGhpcy5hWzNdO3RoaXMuSGk9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy50dD1iO2IucHJvdG90eXBlPXt1cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnE6dGhpcy5rdChhKX0sa3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmx0OnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLnR0fHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1TYy51cSg0KTsoZnVuY3Rpb24oYyl7Yy5wbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLnBtfHxHYjsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzsKYSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLkxwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMub2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnNzKCk6dGhpcy5qZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LExwOmZ1bmN0aW9uKCl7dGhpcy5TZigpfHx0aGlzLm0oITApfSxzczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm9kKCk7IWIucWEmJmIuWSYmYi5BeCYmYi5DeCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoKX0uYmluZCh0aGlzKSwxMDApfSxvZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVoKWZvcih2YXIgYj1sLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLmlkLApjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudWg9YltjXSk7cmV0dXJuIHRoaXMudWh9LFZ4OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLm9kKCkuYWRzTG9hZGVyP3RoaXMuRyghMCk6dGhpcy5HKCk6dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEhiPWMub218fEhiOyhmdW5jdGlvbihjKXtjLnFtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwucGxheWVyYXBpKXt2YXIgYj1sLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgSGIoYyx0aGlzLkkpKS5nKCkpfXJldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgSWI9Yy5xbXx8SWIsSmI9bmV3IEliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNqPXRoaXMuYVszXTt0aGlzLnduPXRoaXMuYVs0XTt0aGlzLlNqPXRoaXMuYVs1XTt0aGlzLktxPXRoaXMuYVs2XTt0aGlzLkRpPXRoaXMuYVs4XTt0aGlzLnNvPXRoaXMuYVs3XTt0aGlzLldvPXRoaXMuYVs2XTt0aGlzLnppPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzZdfWMucnM9YjtiLnByb3RvdHlwZT17Qmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNqOnRoaXMudm4oYSl9LHZuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud246dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNqOgp0aGlzLkpxKGEpfSxKcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS3E6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRpOnRoaXMucm8oYSl9LHJvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zbzp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV286dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56aTp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnJzfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5Caig0KTsoZnVuY3Rpb24oYyl7Yy5mbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxUeDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxNYzpmdW5jdGlvbigpe3JldHVybiEwfSxLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9CmMuZmx8fFg7KGZ1bmN0aW9uKGMpe2MuZGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlllJiZiIT10aGlzLlllfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLmF5KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuZGx8fFk7KGZ1bmN0aW9uKGMpe2MuZ2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5uYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuZ2x8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY2s9dGhpcy5hWzEwXTt0aGlzLiRwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuRW89YjtiLnByb3RvdHlwZT17Yms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmNrOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuRW98fE5iLFVjPW5ldyBOYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5iayg0KTsoZnVuY3Rpb24oYyl7Yy5Qaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LEF1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LApBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5Qanx8T2I7KGZ1bmN0aW9uKGMpe2MuT2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5Panx8UGI7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpOwp2YXIgUWI9Yy5Ranx8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs2XTt0aGlzLkZtPXRoaXMuYVsyXTt0aGlzLmNsPXRoaXMuYVsxXTt0aGlzLlN1PXRoaXMuYVs2XTt0aGlzLld0PXRoaXMuYVs0XTt0aGlzLldsPXRoaXMuYVs3XTt0aGlzLnZ0PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzZdfWMuRnQ9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRsOnRoaXMuRW0oYSl9LEVtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GbTp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5SdShhKX0sUnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlN1OnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV3Q6dGhpcy5WbChhKX0sClZsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbDp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLkZ0fHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Fbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSwKTmQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LGR1OmZ1bmN0aW9uKCl7dGhpcy5SYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJjfHwodGhpcy5SYz0hMCx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5OZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxBYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuRW58fFRiOyhmdW5jdGlvbihjKXtjLkRuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LERoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSwKYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VYihhKX0uYmluZCh0aGlzKSkpLGImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5EaC5iaW5kKHRoaXMpLDEwKX0sVWI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT0KYS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxPZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5VYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuT2YoKTt0aGlzLmd1KCl9LGd1OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGIpe3RoaXMuVWIoYil9KX0sbTpmdW5jdGlvbihiKXt0aGlzLiR0P3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihiKXt0aGlzLiR0PSEwO2lmKGImJmIuZGV0YWlsKWZvcih2YXIgYSBpbiBiLmRldGFpbCkiYWRUYWdVcmwiPT1hJiYoYi5kZXRhaWxbYV18fHRoaXMuVWIoYikpfX0pfSkoYyk7dmFyIFViPWMuRG58fFViOyhmdW5jdGlvbihjKXtjLkZuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIuZHUoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpOwp2YXIgVmI9Yy5Gbnx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLlluPWI7Yi5wcm90b3R5cGU9e2pzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLllufHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy5qcyg0KTsoZnVuY3Rpb24oYyl7Yy5abT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLnhoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT0KYi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLk5zPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxBdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTnN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy54aCYmCih0aGlzLnhoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy5abXx8TzsoZnVuY3Rpb24oYyl7Yy5ZbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuTXUoKTp0aGlzLm0oITApLCEwO3RoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubSgpOnRoaXMubSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnVlPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlM9CnRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLlltfHxQOyhmdW5jdGlvbihjKXtjLiRtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwKKHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuY2YoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLiRtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMucms9dGhpcy5hWzZdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy5Xdj1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSHQ6CnRoaXMucWsoYSl9LHFrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5yazp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Xdnx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuR3QoNCk7KGZ1bmN0aW9uKGMpe2MuSms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ka3x8WjsoZnVuY3Rpb24oYyl7Yy5Jaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5yYigpLCEwO3RoaXMuVWcrKztpZigxMDx0aGlzLlVnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0KITB9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLklrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Laz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLktrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY3A9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzldO3RoaXMuTm49dGhpcy5hWzZdO3RoaXMuS3I9dGhpcy5hWzVdO3RoaXMuSG49dGhpcy5hWzRdO3RoaXMucHE9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5saz1iO2IucHJvdG90eXBlPXticDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY3A6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5lazp0aGlzLk1uKGEpfSxNbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTm46dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktyOnRoaXMuR24oYSl9LEduOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Ibjp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLmxrfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5icCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJgphPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Nanx8ZGM7KGZ1bmN0aW9uKGMpe2MuTGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaWcoKX0saWc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLkxqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Oaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLk5qfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHQ9dGhpcy5hWzldO3RoaXMucmo9dGhpcy5hWzZdO3RoaXMuQnI9dGhpcy5hWzNdO3RoaXMuS3M9dGhpcy5hWzNdO3RoaXMuV3U9dGhpcy5hWzEwXTt0aGlzLkpuPXRoaXMuYVs1XTt0aGlzLnB0PXRoaXMuYVs2XTsKdGhpcy5qPXRoaXMuYVsxMF19Yy5zdD1iO2IucHJvdG90eXBlPXtjdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZHQ6dGhpcy5xaihhKX0scWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnJqOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ccjp0aGlzLkpzKGEpfSxKczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3M6dGhpcy5WdShhKX0sVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLld1OnRoaXMuSW4oYSl9LEluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kbjp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucHQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLnN0fHxoYyxaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9WmMuY3QoNCk7KGZ1bmN0aW9uKGMpe2Mucmk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMucml8fGljOyhmdW5jdGlvbihjKXtjLnBpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGZnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5mZy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnBpfHxqYzsoZnVuY3Rpb24oYyl7Yy5zaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9Cm5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnNpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQW89dGhpcy5hWzJdO3RoaXMuRWo9dGhpcy5hWzRdO3RoaXMuQ2w9dGhpcy5hWzhdO3RoaXMuVG09dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzddO3RoaXMuaj0KdGhpcy5hWzNdfWMuUXM9YjtiLnByb3RvdHlwZT17em86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkFvOnRoaXMuRGooYSl9LERqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fajp0aGlzLkJsKGEpfSxCbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2w6dGhpcy5TbShhKX0sU206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRtOnRoaXMuSm8oYSl9LEpvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMuUXN8fG1jLCRjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLnpvKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdOwp0aGlzLmJmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj8KbnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcWI/bnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLmhtPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuZHIoYSk6W10sYjt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107CnRoaXMueGYoYikmJih0aGlzLnpkLnB1c2goYiksdGhpcy5KaChiKSl9fSx4ZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmJmW2NdLHRoaXMueGYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5nKCl9LGh2OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG5jPWMuaG18fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5RcD10aGlzLmFbMV07dGhpcy5Gaz10aGlzLmFbN107dGhpcy5NcT10aGlzLmFbMTBdO3RoaXMuTXM9dGhpcy5hWzddO3RoaXMuWXU9dGhpcy5hWzZdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMueWo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5ncD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUXA6dGhpcy5FayhhKX0sRWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZrOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5NcTp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTXM6dGhpcy5YdShhKX0sWHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLll1OnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cjp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5ncHx8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9YWQuUHAoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQ2Moay5kdyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywKITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkNjKGsuV3MpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgYmQ9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLlpnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWmcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTsKSS5rYSgpO3ZhciBjZD1iZChmdW5jdGlvbigpe2Uuemcod2luZG93LEkuUXIoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhxPXRoaXMuYVs3XTt0aGlzLll2PXRoaXMuYVs0XTt0aGlzLmJvPXRoaXMuYVszXTt0aGlzLm5yPXRoaXMuYVs3XTt0aGlzLmpqPXRoaXMuYVs0XTt0aGlzLlFvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMuQm89YjtiLnByb3RvdHlwZT17R3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYm86dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5yOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuamo6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5Cb3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuR3EoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnloPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy51ZD0wO3RoaXMuZWI9IiI7dGhpcy5BZD1bXTt0aGlzLkJkPTA7dGhpcy5BaD0hMTt0aGlzLlplPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnRpPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3RoaXMueWg9YX0saGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKRHU6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSxOYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5iYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLlRyKCkpdGhpcy5uYi5sKHRoaXMubmIucWQsCnRoaXMubmIud2EsdGhpcy5uYi5hZixmdW5jdGlvbigpe3RoaXMuTmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLkJjKTtlbHNlIGlmKHRoaXMuc3IoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmp2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm5iLGcpO2wuQnUodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkVzKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJgooYz10aGlzLnBsYXllci5KZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5MZShhLGMsZik7dGhpcy5wbGF5ZXIuTGgobCl9fSxUcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnVkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yj8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LCR1OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UuZ2YoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX0sWnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueWgpe2UuZ2YoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLkl1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnZnKGMpKT90aGlzLk5jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LGp1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuT3UodGhpcy5adS5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuTmEoKX0sRmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZ2YoIm1pZHJvbGwiKTtpZighdGhpcy5uaCl7dGhpcy5uaD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5OYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX19LGl1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHUodGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy4kdSgpO3RoaXMucGxheWVyLk9lJiZ0aGlzLml1KCk7dGhpcy5qdSgpfSxrdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5BZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuV3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxzcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSx2dTpmdW5jdGlvbihhKXt0aGlzLkFoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuUHQuYmluZCh0aGlzKSl9LFB0OmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLlplLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy5BaCgpfSxFczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5aZS5sZW5ndGg7YysrKWI9CnRoaXMuWmVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubXY9dGhpcy5hWzRdO3RoaXMuS2o9dGhpcy5hWzNdO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnRxPXRoaXMuYVs1XTt0aGlzLlR3PXRoaXMuYVszXTt0aGlzLmZ0PXRoaXMuYVs4XTt0aGlzLlR2PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzldfWMuUG09YjtiLnByb3RvdHlwZT17bHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm12OnRoaXMuSmooYSl9LEpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2o6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMuc3EoYSl9LHNxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6CnRoaXMuU3coYSl9LFN3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udzp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZnQ6dGhpcy5TdihhKX0sU3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Udjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuUG18fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLmx2KDQpfSkuY2FsbChhdUZlZXNodWVlWWFpeW9vLGF1RmVlc2h1ZWVZYWl5b28pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.219.73.111
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 E2F6
|
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=1186199846
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGF1RmVlc2h1ZWVZYWl5b289YXVGZWVzaHVlZVlhaXlvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5wcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5EdShtKTthLkN1KGwpO2Eua3UoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5MdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXQ9dGhpcy5hWzVdO3RoaXMuTG49dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLnFvPWI7Yi5wcm90b3R5cGU9e1h0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZdDp0aGlzLktuKGEpfSxLbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTG46dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndvOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5GaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMucW98fGhhLHNjPQpuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5YdCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5wcD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuT3QuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5Waj1iO2IucHJvdG90eXBlPXtpdjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTsKdGhpcy5vYlthXSs9MTs1PHRoaXMub2JbYV0mJiF0aGlzLlNnW2FdJiYodGhpcy5TZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLml2KCksITApKX0sb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sb286ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSwKe3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxPdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5OdChhLmRhdGEpfSxOdDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9CkpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sSGc6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbW86ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLk5xKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PQpiLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LE5xOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxjczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9CmFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sb2Y6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOgohMTohMX0sRmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3E9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmUoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYKMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09CnR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eT1rO3U9bTtyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHEsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChxLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7Cm09bSt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihtKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxxPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sWnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxrZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17UWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sJGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCnhyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LHNuOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxhbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LEhtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sWW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5RaSgpfHxhLiRpKCl8fGEueHIoKXx8YS5VbCgpfHxhLnNuKCl8fGEuYWwoKXx8YS5IbSgpfX07cmV0dXJuIG51bGwhPWEuWW8oKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpOwp2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxmcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sVnA6ZnVuY3Rpb24oYSwKYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LGF2OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj0KYX0semc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5DYjt0aGlzLmVlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sUXQ6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJgoxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5mcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGJ2OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9CnRoaXMuWmIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmVlKGEpfSxlZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlF0KGEpO2lmKGIpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKGIpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTWQ6ZnVuY3Rpb24oYSl7aWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLnpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuY3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8CnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMueGcoYSkpcmV0dXJuIHRoaXMueGcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSwKZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnNkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLm1vKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIGw9ZXx8bTtlPSEwO2smJihlPSExKTtpZihsJiZsLlYpaWYobC5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLApjLGwsZyxrKX0uYmluZCh0aGlzKSw1MDApfSxraDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5czpmdW5jdGlvbihhLApiLGQpe3RoaXMua2goYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuT2MpZm9yKHZhciBjIGluIHRoaXMuT2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5PY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5iYihhLGYuTGEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnlzKGYuc2QoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEx1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LFd3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIiwKZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxhcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sWHI6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0KMDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLlZqfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlVqPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuQ3Q9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuS3c9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi55cT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLllmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlFmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuY289e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07CmIuaXc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlVzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnpxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Pdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLk5wPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5mZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTsKYi56Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuWGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLmZvPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5YYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLmVvPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTsKYi5Ycz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnZkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuSnc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZXc9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmZ3PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Xcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5Vanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs2XX1jLnBqPWI7Yi5wcm90b3R5cGU9e0Z2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIGphPWMucGp8fGphLHZjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Gdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLldqPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxsYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sYXI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrCm5hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG5kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5uZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm5kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sa2E6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLmxhKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm5kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxRcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuYXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5uZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9Yy5Xanx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50cD10aGlzLmFbNV07dGhpcy5rbT10aGlzLmFbOF07dGhpcy4kbz10aGlzLmFbN107dGhpcy5OaT10aGlzLmFbOF07dGhpcy4kdz10aGlzLmFbMV07dGhpcy5sdz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs3XX0KYy5ucT1iO2IucHJvdG90eXBlPXtzcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudHA6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmttOnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbzp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmk6dGhpcy5adyhhKX0sWnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR3OnRoaXMua3coYSl9LGt3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMubnF8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLnNwKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CnZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5raj1ifSkoYyk7dmFyIEw9Yy5ranx8Ckw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ249dGhpcy5hWzddO3RoaXMuSGs9dGhpcy5hWzhdO3RoaXMuRXQ9dGhpcy5hWzddO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMub3M9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbN119Yy5SaT1iO2IucHJvdG90eXBlPXtCbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ246dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkhrOnRoaXMuRHQoYSl9LER0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FdDp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubmo6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5SaXx8bGEseGM9bmV3IGxhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLkJuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuZ209TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5NYT17fTt0aGlzLkk9bnVsbDt0aGlzLkxjPTEwMDt0aGlzLkliPTA7dGhpcy5XYT0xNTA7dGhpcy5MYj0wO3RoaXMuRXUoYil9LGc6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhPyh0aGlzLkliKyssdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkxjKSk6MD50aGlzLldhJiYodGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkxjKSl9LHB1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWI+dGhpcy5XYT8hMDohMX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLkliPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKRXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuUCgpLCEwKTt0aGlzLk1hW2IubGEoKV09YjtNJiZNLmhoJiZNLmh2KGIpfSxOeDpmdW5jdGlvbigpe3JldHVybiBlLnllKHRoaXMuTWEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX0sWXI6ZnVuY3Rpb24oYil7Yj1iLkthKCk7Zm9yKHZhciBhIGluIHRoaXMuTWEpaWYoYi5pZD09dGhpcy5NYVthXS5LYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxleTpmdW5jdGlvbihiKXt0aGlzLk1hW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLmdtfHx0OyhmdW5jdGlvbihjKXtjLmltPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9CnRoaXMuaWQ9bnVsbDt0aGlzLkxjPTEwO3RoaXMuSWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubmE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkJiPSIiO3RoaXMucmc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5LYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxNOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30sT3U6ZnVuY3Rpb24oYil7dGhpcy5YPWJ9LE94OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sSHU6ZnVuY3Rpb24oYil7dGhpcy5QZT1ifSxNeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlfSxPZTpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2EmJih0aGlzLkliKyssCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTGMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sRmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sCmxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sZ3k6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMudHIoKXx8dGhpcy5pbygpO3RoaXMuRGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxQeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxpbzpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5hYSgxMCkpfSx0cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sVzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxLYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFZTpmdW5jdGlvbigpe3JldHVybiEwfSwKaXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFh4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmF9LGNhOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMH0sTWM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExoOmZ1bmN0aW9uKGIpe3RoaXMuQmI9Yn0sTHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPQpudWxsfSxSeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuQmImJihiPSEwKTtyZXR1cm4gYn0sYnk6ZnVuY3Rpb24oKXt0aGlzLnJnfHwodGhpcy5yZz0hMCl9LHZlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEl4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLmltfHxwOyhmdW5jdGlvbihjKXtjLnVpPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5JPXRoaXMucGxheWVyPSIiO3RoaXMuTWY9IjEiO3RoaXMuTmY9IjIiO3RoaXMuV249IjMiO3RoaXMuVGM9MDt0aGlzLm9oPTMwO3RoaXMuUmI9W107dGhpcy5oYj1bXTt0aGlzLnBjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLiRmPXRoaXMuZ2k9ITE7dGhpcy5zdGF0dXM9dGhpcy5UYzsKdGhpcy5pZD1lLmFhKDEwKTt0aGlzLmhmKGIpO3RoaXMuRnUoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5naXx8KHRoaXMuZ2k9ITAsZS5NZSgpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmJjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxOcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5rYSgpXXx8KHdpbmRvd1thLmthKCldPXt9KTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldfHwod2luZG93W2Eua2EoKV1bYi5sYSgpXT17fSx3aW5kb3dbYS5rYSgpXVtiLmxhKCldLmluaXRpYXRvcj1lLlpiKCkpO3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT93aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV0rKzp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV09MX0sVnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLAphPSEwLGg9bmV3IEo7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0uaW5pdGlhdG9yIT1lLlpiKCkmJih0aGlzLmpmKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMueGEoKSl7dGhpcy5OcigpO2lmKCF0aGlzLlZyKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmpmKCk7cmV0dXJufXRoaXMuamYoKTt0aGlzLkkodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLiRoKCk7dGhpcy4kZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSx1OmZ1bmN0aW9uKGIsYSl7dGhpcy54YSgpfHwodGhpcy5SYi5wdXNoKGIpLHRoaXMuaGIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5SYiYmMDx0aGlzLlJiLmxlbmd0aCYmKHRoaXMuUmI9CmUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaGIpe2Zvcih2YXIgaD0wO2g8dGhpcy5oYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5oYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5oYltoXS5yZWFzb25dPHRoaXMucGNbYl0mJihhPVtdLGEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksYj10aGlzLmhiW2hdLnJlYXNvbik7dGhpcy5wY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LFF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZ9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxqZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTmZ9LE11OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuV259LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTWZ9LHl4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk5mfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30saGY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxGdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0sWnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxCczpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMudWl8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3A9dGhpcy5hWzZdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuJGs9dGhpcy5hWzZdO3RoaXMuYng9dGhpcy5hWzEwXTt0aGlzLmlxPXRoaXMuYVs2XTsKdGhpcy5kaj10aGlzLmFbOV07dGhpcy5keD10aGlzLmFbOV07dGhpcy5Gcj10aGlzLmFbOF07dGhpcy5mcz10aGlzLmFbM107dGhpcy5Vbz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkdtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3A6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnByOnRoaXMuWmsoYSl9LFprOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy4kazp0aGlzLmF4KGEpfSxheDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYng6dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlxOnRoaXMuY2ooYSl9LGNqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZGo6dGhpcy5jeChhKX0sY3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR4OnRoaXMuRXIoYSl9LEVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gcjp0aGlzLmVzKGEpfSxlczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5mczp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLkdtfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ucCg0KTsoZnVuY3Rpb24oYyl7Yy5Haj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Hanx8b2E7KGZ1bmN0aW9uKGMpe2MuSGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLnp4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPwoodGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuSGp8fHBhOyhmdW5jdGlvbihjKXtjLklqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pOwp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Janx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNxPXRoaXMuYVs5XTt0aGlzLnVzPXRoaXMuYVsxMF07dGhpcy5KbT10aGlzLmFbMTBdO3RoaXMuTXI9dGhpcy5hWzEwXTt0aGlzLmJ3PXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMueWw9YjtiLnByb3RvdHlwZT17QnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNxOnRoaXMudHMoYSl9LHRzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51czp0aGlzLkltKGEpfSxJbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkptOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ncjp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy55bHx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQnEoNCk7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuTXA9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMueWt8fHNhOyhmdW5jdGlvbihjKXtjLnhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UYzt0aGlzLmlzUGxheWluZz10aGlzLlZjPSExO3RoaXMuYmU9MTt0aGlzLldjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlZjPSExO3RoaXMuYmU9MTt0aGlzLldjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5NcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueWQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlZjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5XYy5pbmRleE9mKGEpJiZ0aGlzLldjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuV2MubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LEJzOmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5WY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMueGt8fHRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuV3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5ZcihoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LEt4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFdxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy56a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sdj10aGlzLmFbNV07dGhpcy52aj10aGlzLmFbOV07dGhpcy5TdD10aGlzLmFbNF07dGhpcy5waz10aGlzLmFbMV07dGhpcy51dT10aGlzLmFbMl07dGhpcy5tcz10aGlzLmFbNV07dGhpcy5Caz10aGlzLmFbNF07dGhpcy5tcT10aGlzLmFbMV07dGhpcy51bT10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVszXX1jLndqPWI7Yi5wcm90b3R5cGU9e1F2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Sdjp0aGlzLnVqKGEpfSx1ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmo6dGhpcy5SdChhKX0sUnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlN0OnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wazp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1zOgp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQms6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1xOnRoaXMudG0oYSl9LHRtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMud2p8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlF2KDQpOyhmdW5jdGlvbihjKXtjLm1uPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSwKYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5tbnx8eGE7KGZ1bmN0aW9uKGMpe2MubG49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5GYz10aGlzLkNhPXRoaXMuJGM9ITE7dGhpcy5CaD1lLkhiKDEwKTt0aGlzLmZpPSEwO3RoaXMudWM9dGhpcy5XZz0hMTt0aGlzLlRzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5yaCgpLHRoaXMudnAoKSx0aGlzLnJiKCkpfSxUczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxjeTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkubGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi4kZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkouaWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5pZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkJoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFliOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSmc6ZnVuY3Rpb24oKXtpZighdGhpcy5GYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkZjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5GYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkZjfSxXcjpmdW5jdGlvbigpe2lmKCF0aGlzLlZnKXt2YXIgYj10aGlzLnliKCksYT10aGlzLlVyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5WZz0hMCl9cmV0dXJuIHRoaXMuVmd9LFVyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuJGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLiRjPSEwKTtyZXR1cm4gdGhpcy4kY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlliKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuaHUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksCjIwKX0saHU6ZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3ZhciBiPXRoaXMuSmcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnZjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApfSxKeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmIuYWRzJiYodGhpcy5vZz1iLmFkcyk7cmV0dXJuIHRoaXMub2d9LHZwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2EoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuSmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSw1MCkpfSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuV3IoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5ZYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5ZYigpLHRoaXMudWN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMueWIoKX1lbHNlIHRoaXMuV2c/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCksYj10aGlzLlliKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuV2c9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yaCgpfS5iaW5kKHRoaXMpLAo1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHdwOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud3AoKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5maT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5maSxmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sRHA6ZnVuY3Rpb24oKXt0aGlzLlN4fHwoMTA8dGhpcy53dz8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnd3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMub3UoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRHAoKX0uYmluZCh0aGlzKSwKNTApKSl9LG91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnh3KXt0aGlzLnh3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMubG58fHlhOyhmdW5jdGlvbihjKXtjLm5uPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS55ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpfX0pfSkoYyk7dmFyIHphPWMubm58fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbMTBdO3RoaXMuanA9dGhpcy5hWzRdO3RoaXMuU3I9dGhpcy5hWzZdO3RoaXMuWnM9dGhpcy5hWzVdOwp0aGlzLkFqPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs4XX1jLkx3PWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpwOnRoaXMuUnIoYSl9LFJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Tcjp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnM6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLkx3fHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9QmMuYW4oNCk7KGZ1bmN0aW9uKGMpe2MuWWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxLdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5iYyYmKDA8PWguaW5kZXhPZihkKXx8YS55ZCgpKX0sCnBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKToKd2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuWWx8fENhOyhmdW5jdGlvbihjKXtjLlhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9CjApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5EcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLkRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuS3QoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuWGx8fERhOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLlpsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanQ9dGhpcy5hWzNdO3RoaXMuU3M9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzhdO3RoaXMueHQ9dGhpcy5hWzhdO3RoaXMucmw9dGhpcy5hWzldO3RoaXMubGw9dGhpcy5hWzddO3RoaXMuSW89dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbM119Yy5icT1iO2IucHJvdG90eXBlPXtpdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanQ6dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNzOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wbDp0aGlzLnd0KGEpfSx3dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueHQ6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLmxsOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Jbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuYnF8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLml0KDQpOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkdnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMuTXQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD0KYi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5NdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmxkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5sZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubGQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxDcDpmdW5jdGlvbigpe2UuYmgodGhpcy5sZCk7CmUuRmUodGhpcy5sZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy52a3x8SGE7KGZ1bmN0aW9uKGMpe2MudWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMudWt8fElhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkdnKGIsImVsZW1lbnRJRCIpO2lmKGUuYmgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9ZWxzZSB0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLndrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuQWw9dGhpcy5hWzFdO3RoaXMuSXI9dGhpcy5hWzNdO3RoaXMueHU9dGhpcy5hWzRdO3RoaXMuRHI9dGhpcy5hWzZdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueW49dGhpcy5hWzddO3RoaXMuTW89dGhpcy5hWzVdO3RoaXMuWWs9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzVdfWMueGk9YjtiLnByb3RvdHlwZT17cXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ0OnRoaXMuemwoYSl9LHpsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWw6dGhpcy5IcihhKX0sSHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Jcjp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueHU6dGhpcy5DcihhKX0sQ3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkRyOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLnhuKGEpfSx4bjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW46dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1vOnRoaXMuWGsoYSl9LFhrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMueGl8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnF0KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9CmE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sR3U6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxqbzpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLlhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9bmV3IHooYSkpO3ZhciBjPXRoaXMuZ2I9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTsKaWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5PZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuR3UoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLllqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9CiIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5nYi5zZW5kKGEpfWNhdGNoKGYpe20mJm0uSWUodGhpcy4kYS51cmwpP20uT2Q/bS5pYSgicmVxdWVzdF9mYWlsZWQiKToKZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuWWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17S3U6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxKdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17aXg6IkFkQ2xpY2tUaHJ1IixreDoiQWRFcnJvciIsbHg6IkFkU3RvcHBlZCIsb3g6IkFkTGluZWFyQ2hhbmdlIixweDoiQWRUYWdQYXJzZWQiLHN4OiJBZFZpZGVvQ29tcGxldGUiLAp2eDoiQWRMb2FkZWQiLHd4OiJBZFNraXBwZWQiLHh4OiJBZFN0YXJ0ZWQiLG14OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsbng6IkFkSW1wcmVzc2lvbiIsang6IkFkQ3JlYXRpdmVWaWV3IixxeDoiQWRWaWRlb01pZHBvaW50IixyeDoiQWRQYXVzZWQiLHR4OiJBZFZpZGVvU3RhcnQiLHV4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LGx1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5IYSYmdGhpcy5IYS5WZClmb3IodmFyIGIgaW4gdGhpcy5IYS5WZCl0aGlzLkhhLlZkLmhhc093blByb3BlcnR5KGIpJiYKYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMubXUoKTt0aGlzLkhhJiZ0aGlzLmx1KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuV3A9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9IiI7dGhpcy5laD0hMTt0aGlzLndhPXRoaXMucWQ9IiI7dGhpcy4kZz10aGlzLlY9dGhpcy5pc0VuYWJsZWQ9dGhpcy5hZj0hMTt0aGlzLnBhPVtdO3RoaXMuUGc9dGhpcy5nYz0iIjt0aGlzLnJlPSExO3RoaXMuc2Y9MDt0aGlzLkhmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiOwp0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuS2Q9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5FcD10aGlzLlFkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9dGhpcy53Zj10aGlzLk9kPXRoaXMubGU9dGhpcy5VYz0hMTt0aGlzLmliPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnJkPTA7dGhpcy5SZz0hMTt0aGlzLlFnPTFFMzt0aGlzLmJkPSExO3RoaXMuUWE9MUUzO3RoaXMuUGY9IiJ9Yy5aaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5XcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnFkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZyxzZXJ2ZXI6dGhpcy5wYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlBnLGRpc2FibGVDb29raWVUZXN0OnRoaXMucmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuc2YsSE9NQURfVkVSSUZJRUQ6dGhpcy5IZixIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsCkhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuS2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkVwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk9kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaWIsc2l0ZUNvbmZpZzp0aGlzLkZhLHNlcnZlcklkOnRoaXMuS2gsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmtiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5OaCx2bWFwczp0aGlzLmxpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5iZCxhZEZhbGxiYWNrVVJMOnRoaXMuUGZ9fSwKcnI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxYcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsCmRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmFwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy54Y3x8dGhpcy53Ynx8dGhpcy53Y3x8dGhpcy5qZSkmJihnPXRoaXMuSXMoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ZcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Cmc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LEdjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnBhJiZ0aGlzLnBhLmxlbmd0aCYmMDx0aGlzLnBhLmxlbmd0aCYmKGI9dGhpcy5wYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9CmIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuRXg7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhW3RoaXMuS2hdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxiPXRoaXMuTWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsCmIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEhzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sQz0wO0M8Zy5sZW5ndGg7QysrKXt2YXIgaz1nW0NdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMucGgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj0KdGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LElzOmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkhzKGEsdGhpcy53YykpO3JldHVybiBhfSxCcDpmdW5jdGlvbigpe3RoaXMuRmEmJnRoaXMuRmEuY2xpZW50QVBJcyYmdGhpcy54cCh0aGlzLkZhLmNsaWVudEFQSXMpfSx4cDpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuS3UoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkp1KGEucGxheWVyKTtiLmcoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLAplKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlFkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5CcCgpO3RoaXMueHMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy52cygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSx4czpmdW5jdGlvbigpe3RoaXMuRGEobmV3IHoodGhpcy5xZCt0aGlzLmdlKCJnbG9iYWwiKSksCnRoaXMubHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sdnM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5GYSYmdGhpcy5GYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuRmEmJnRoaXMuRmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxpYTpmdW5jdGlvbihhKXtpZighdGhpcy5sZSl7dGhpcy5sZT0hMDsKdmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiYKYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpO3RoaXMuTmIoKTtlLkNjKGsuQ3QpOyhiPWUuJGIodGhpcy5zZCgpKSl8fChiPWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGxyOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPQp7fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy53YX1lbHNlIGE9dGhpcy53YTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGEuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLnBhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09CnRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuS2g9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMucGEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5nYyYmdGhpcy5MYSYmdGhpcy5wYS5sZW5ndGg/dGhpcy5IYyghMSk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPQohMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTt0aGlzLkRhKGIsdGhpcy5rdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY3VzdG9tZXIiKTthP3RoaXMuRG0/dGhpcy5pYSgibm9TVk1Db25maWciKToodGhpcy5EbT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGMoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxrdjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5PZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5pYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmtjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuS2Q9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnhjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMud2I9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuY2Q9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYmQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5lcihiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMucmUmJih0aGlzLmhjPW51bGwpO3RoaXMudGY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuSHYoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuS2QpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy5ydigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnN2KCkpfX0scnY6ZnVuY3Rpb24oKXt0aGlzLnF2KCk7dGhpcy50digpfSx0djpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmEoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5rZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuVmEoKSl7aWYodGhpcy5GYSYmdGhpcy5GYS5wbGF5ZXImJnRoaXMuRmEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7CnJldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxzdjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5VYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSxxdjpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUua2QoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmljKTsKYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy53dihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlBjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5LZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sd3Y6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMueHYoYywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSx4djpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1jO2sub25lcnJvcj1lO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy5wdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHB2OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5UaCgpOnRoaXMucWYoIkFBQSIpfSxUaDpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpOwp0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVWMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuSGYpKTt0aGlzLlFkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuUWQmJnRoaXMuUWQoKX0sQXA6ZnVuY3Rpb24oKXtpZih0aGlzLndmJiYKdGhpcy5ycigpKXt2YXIgYT10aGlzLlhxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnJkfHwodGhpcy5yZD0wKTt0aGlzLnJkKys7dGhpcy5yZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2MmJihhLm9pPSEwKTtxJiZlLlpyKCkmJihhLkJnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSx5cDpmdW5jdGlvbigpe2UuVmEoKXx8ZS5iYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuR2MoKXx8KGE9dGhpcy56YShjKSxjPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7Zy5uZXR3b3JrU3RhdGU9PQpnLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxudjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5saX0senA6ZnVuY3Rpb24oKXt0aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMuaHcuYmluZCh0aGlzKSx0aGlzLmd3LmJpbmQodGhpcykpfSxodzpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuQXEoKX0sZ3c6ZnVuY3Rpb24oKXt9LEFxOmZ1bmN0aW9uKCl7ZS5DYyhrLnpxKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmlhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxuZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuSmIubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxIdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxlcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPQphLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLlpqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5mcD10aGlzLmFbMl07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaGo9CnRoaXMuYVsxXTt0aGlzLmh0PXRoaXMuYVs4XTt0aGlzLmhzPXRoaXMuYVs1XTt0aGlzLlhtPXRoaXMuYVs3XTt0aGlzLlZ2PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzhdfWMuT2w9YjtiLnByb3RvdHlwZT17ZXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZwOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tbzp0aGlzLmdqKGEpfSxnajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaGo6dGhpcy5ndChhKX0sZ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmh0OnRoaXMuZ3MoYSl9LGdzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oczp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWG06dGhpcy5VdihhKX0sVXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5PbHx8UGEsRWM9bmV3IFBhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmVwKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy4kdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy5hZD0hMTt0aGlzLlhvPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307ZS5wYigibmV3QmlnQWRJZCIpO3RoaXMua3A9ZS5hYSgxMCk7dGhpcy5tZj0wO3RoaXMuWmM9IldlcmJ1bmcgLSBbdGltZV0iOwpjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWmM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWmM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMucG89Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkdkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5iYz0hMTt0aGlzLk9wPWUuYWEoMTApO3RoaXMuR2I9ZS5hYSgxMCk7dGhpcy5FYj1lLmFhKDEwKTt0aGlzLk9oPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLlJkPXRoaXMuT2I9dGhpcy5wZT10aGlzLmdkPXRoaXMuSWQ9CnRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubWQ9dGhpcy5Ldj10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLnhkPXt9fWMuVGo9YjtiLnByb3RvdHlwZT17QnU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLmR2KCk7ZS52KGsuZm8sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTGU6ZnVuY3Rpb24oYSxiLGMsZil7dGhpcy51Yj1jO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5BcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLG5ldyBTKHRoaXMsYSx0aGlzLm1oLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLm1jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5RYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLApjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUmQ9dGhpcy5PYj10aGlzLm1kPSExO3RoaXMuYz1hO3RoaXMuUHUodGhpcy5jKTt0aGlzLnhkPW5ldyBRYSh0aGlzLmMubncsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5IcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5IZD10aGlzLmhyKGEpKSx0aGlzLk1nKGEucGFyZW50KSl9LERnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YKYnx8KGM9dGhpcy5EZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLlNxKGEpKSk7cmV0dXJuIGN9LFNxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxocjpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxnPSIiO2lmKGEuVSl7Yj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEubGIoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpnfX0sc2E6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBiPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLmpkJiZhLmpkLmVycm9yJiZhLmpkLmVycm9yLmNvZGUmJihiPWEuamQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PQpHLlhkLmNvZGU/ZS52KGsuS3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5NZSgpLGI9PUcuS2YuY29kZSYmZS52KGsuVXMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk7ZS52KGsueXEsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmV2KCk7dGhpcy5YYSgiZW1wdHkiKTticmVhaztjYXNlIHcuSWYuY29kZTplLnYoay5pdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LkxmLmNvZGU6ZS52KGsuT3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuWWQuY29kZTplLnYoay5Qdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6ZS52KGsuVnMsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLmV3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5FZi5jb2RlOmUudihrLmZ3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLlhiKGEpO3RoaXMuUmEoKX0sWGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5LZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sUHU6ZnVuY3Rpb24oYSl7dGhpcy5wZT0hMTt0aGlzLlBiPQp0aGlzLmIuSzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5QYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuJGU9ITB9Y2F0Y2goZil7fX1jYXRjaChlKXt9Yi5keT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsCnRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTt0aGlzLnBvJiZ0aGlzLnBsYXllci52ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuTy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5PW2NdLnR5cGUpJiZ0aGlzLmtvKGIsYS5PW2NdLnVybCsiIixhLk9bY10udHlwZSk7dGhpcy4kZSYmYi5sb2FkKCk7aWYodGhpcy5YaChiKSl7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5ubyhiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7CnRyeXt0aGlzLiRlP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2goayl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5LcCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuTnUoKSk6dGhpcy5jLm9yaWdpbi51Zyh3LlVkKX0sTnU6ZnVuY3Rpb24oKXt0aGlzLkNmPSEwO3RoaXMuc2I9dGhpcy5uYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLm1nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5zYj0hMCk7ZS5vZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmCmUub28odGhpcy5jLm9yaWdpbi52YSk7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9RS5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi53aCgpO3RoaXMuYi5rZigpO2ZvcihhPXRoaXMuYi5LO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIua2YoKTt0aGlzLnRhPXRoaXMuUGI9dGhpcy5iLks7dGhpcy5oaSgidnBhaWQiKTtpZih0aGlzLnNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuS2IoIm11dGVkIiwiY29udGVudCIpO2UudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5LLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmtyKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmRnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5oZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJiF0aGlzLklkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay56YywKdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuYWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuc2M9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy55dyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnp3KCksdGhpcy5iLmFjKCEwKSwhdGhpcy5PYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy5ILApjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuR2UodGhpcy5PYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmFjKCEwKSx0aGlzLkR3KCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5IdygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5GdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkl3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkV3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm1pKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5WYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkwuYmR8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5RYyYmKHRoaXMuRGY9ITEsdGhpcy5mYygpKSx0aGlzLkJ3KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuc2I9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay52ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5zYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmhlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLmFnKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5ILCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sQXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLm5jPSEwfSxCdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlhjLHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubmM9ITF9LER3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sQ3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5RaCgpO2UudihrLlRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLlhjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubWQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlFmLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxHdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5WZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxJdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbWk6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7CmUub2UoKTt0aGlzLkg9ITE7dGhpcy5SYShhKX19LHl3OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5Kdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubWkoITApfSxrbzpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuR2MoKSl7dmFyIGQ9Yi56YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuc3cuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmMoYix0aGlzLkwpKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LG5vOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmlpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmppLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmppLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0saWk6ZnVuY3Rpb24oYSl7dGhpcy5XYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldifHx0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuWG8pKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWQmJnRoaXMuWGgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5XYil7dGhpcy5hZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5aYSgpLCEwKSx0aGlzLkwudGd8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLnB3KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIua2YoKTt0aGlzLm93KCk7dGhpcy5oaSgpO3RoaXMuZWcoKTt0aGlzLmIud2goKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMubmYoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nZHx8dGhpcy5SZigpfSxSZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmdkfHwoYT90aGlzLlJhKCk6KHRoaXMuUWUoITApLHRoaXMuUmYoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmVjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkxoKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuTC5rYiYmIXRoaXMuRmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5jbyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuUmEoKX0saG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9ITEsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9ZS5IZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQSgpKTtlLmJ2KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJgp0aGlzLmMuU2QmJnRoaXMuaG8odGhpcy5jLlNkKTtpZighdGhpcy5wZSlpZih0aGlzLnBlPSEwLHRoaXMuUmR8fChlLnYoay5Ycyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy50Ynx8dGhpcy5jLnFjKXtlLnBiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm1mKys7dGhpcy5XYj10aGlzLmFkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5HZD0hMTt0cnl7dGhpcy5iLmVpKCl9Y2F0Y2goZyl7fXRoaXMuSWQ9ITA7dGhpcy5iLkJlKCk7dGhpcy5iYz0hMTt0aGlzLnhlKCkuR2goKTt0aGlzLmMudGImJnRoaXMuYy5vcmlnaW4uUmUoKTt0aGlzLmMucWMmJihhP3RoaXMuYy5vcmlnaW4ucWgoKToKdGhpcy5xZSgpKX1lbHNlIHRoaXMucWUoKX0sc3c6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5XYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkwueXAoKTt0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxqaTpmdW5jdGlvbigpe2lmKHRoaXMuS3YpdGhpcy5SYSgpO2Vsc2V7dGhpcy5iYz0hMDt0aGlzLmIuZi5BYSYmIXRoaXMuSWQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dmFyIGE9Ck1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5OdihhKTtpZighdGhpcy5PYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5SZD0hMDtlLnYoay5raSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5sZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PaCkpJiYoYz10aGlzLmMubGYtCmEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy50Yj8odGhpcy5XYj10aGlzLmFkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5HZD0hMSx0aGlzLmIuZWkoKSx0aGlzLmMub3JpZ2luLlJlKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWmMucmVwbGFjZSgiW3RpbWVdIiwKZS5DZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmZlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxiaTpmdW5jdGlvbigpe3RoaXMudmh8fCh0aGlzLnZoPSEwLHRoaXMubWR8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxOdjpmdW5jdGlvbihhKXtlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuY2l8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYmkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5RaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLAp0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5rYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5UZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMubWQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLnYoay5RZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5jaT1hKX0sUGg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsYiwhMCl9LGR2OmZ1bmN0aW9uKCl7ZS5NZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxRaDpmdW5jdGlvbigpe2UuTWQoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0sZXY6ZnVuY3Rpb24oKXtlLk1kKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sClhhOmZ1bmN0aW9uKGEpe2UuTWQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuTC5rYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxLYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5rYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkZiKXt0aGlzLnhkJiZ0aGlzLnhkLnRyYWNrJiZ0aGlzLnhkLnRyYWNrKGEpO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLmlyKHRoaXMuYy5QYSxhKX1jYXRjaChmKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgZz1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmCih0aGlzLmtlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmUuWHIoZy51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZW8sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLktlKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmMuUGE9dGhpcy5VcCh0aGlzLmMuUGEsYSl9Y2F0Y2gobSl7fX19LFphOmZ1bmN0aW9uKCl7dmFyIGE9ZS5WYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixiPSIiO3RoaXMuQ2YmJihiPSJfdnBhaWQiKTt0aGlzLlFjJiYoYj0iX3dlbGVjdCIpO3JldHVybiBhK2J9LEtlOmZ1bmN0aW9uKGEsYixjLGYsZSl7YSYmInN0cmluZyI9PQp0eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxjJiZiLmpvKGMpLGZ8fChmPXRoaXMuc2cpLGV8fChlPXRoaXMuc2cpLHRoaXMubG8oYSksdGhpcy5MLkRhKGIsZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGxvOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09Im9wZW4ifSxGaDpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJjbG9zZWQifSxIcDpmdW5jdGlvbigpe3RoaXMuZGM9e319LGd2OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuZGMpdGhpcy5kYy5oYXNPd25Qcm9wZXJ0eShiKSYmIm9wZW4iPT10aGlzLmRjW2JdJiZhKys7cmV0dXJuIGF9LGlyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sVXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpifSl9LHB3OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5xdy5iaW5kKHRoaXMpKX0scXc6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmZjKCk6dGhpcy5jLlZiJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5MLmJkfHx0aGlzLlFjKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLlZifWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYy5WYixhKX19LmJpbmQodGhpcyksNTAwKSl9LApvdzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlpjLnJlcGxhY2UoIlt0aW1lXSIsZS5DZygwKSk7CnZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5jZCYmKGI9dGhpcy5MLmNkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5jZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sRWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5jZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGhpOmZ1bmN0aW9uKGEpe2lmKCFlLm9mKHRoaXMuY29udHJvbHMpKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpjLmlkPXRoaXMuT3A7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuR2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkViO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Ndi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkx2LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk9oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmMuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmxmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXt0aGlzLkJhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLm1nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGZjOmZ1bmN0aW9uKCl7dGhpcy5CYSYmImJsb2NrIj09dGhpcy5CYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxZaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuWGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxaaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMubmM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLm5jPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLm5jPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5YYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LEx2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxNdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuc2I/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5zYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMuc2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSwkdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmVjKTt0aGlzLmdkfHx0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0scWU6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUua2QoKTshdGhpcy5MLm1jfHxlLlZhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5rZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy50aHx8IXRoaXMuTC5VYyYmInNwaWVnZWwuZGUiIT1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwicHJlcm9sbCIhPWUuQ2I/KHRoaXMuZ2Q9ITAsdGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy5uZygpKToodGhpcy50aD10aGlzLlFjPXRoaXMuRGY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5rZT0hMCxhPWUuZGcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuTGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuZ3YoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy5JZD0hMCx0aGlzLmIuQmUoKSx0aGlzLmIucXUoKSx0aGlzLmJjPSExLAplLnYoay5OcCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMueGUoKS5HaCgpKX0seGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZWc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZS5GZSh0aGlzLnZpZGVvLGEpP3RoaXMuSWgoKTp0aGlzLnlkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVmIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5zYyYmMDx0aGlzLnNjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5zYykpO3RoaXMudmlkZW8mJgp0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMua3ArIi0iK3RoaXMubWY7dGhpcy5jJiZ0aGlzLmMuSWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLklnKCkpO3JldHVybiBhfSxzZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuVGp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRwPXRoaXMuYVsyXTt0aGlzLm50PXRoaXMuYVs4XTt0aGlzLll3PXRoaXMuYVsxXTt0aGlzLm5rPXRoaXMuYVsxMF07dGhpcy5raz10aGlzLmFbNV07dGhpcy5Vbj10aGlzLmFbNV07dGhpcy5Bbj10aGlzLmFbNl07dGhpcy5lbj10aGlzLmFbMV07dGhpcy52cj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLkJpPWI7Yi5wcm90b3R5cGU9CntTcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVHA6dGhpcy5tdChhKX0sbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm50OnRoaXMuWHcoYSl9LFh3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Zdzp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubms6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmtrOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Vbjp0aGlzLnpuKGEpfSx6bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQW46dGhpcy5kbihhKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVuOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuQml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5TcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkdhPW51bGw7dGhpcy5ZPVtdO3RoaXMuVT1udWxsO3RoaXMucmM9dGhpcy50Yz0hMTt0aGlzLnZhPSIiO3RoaXMuQmY9ITE7dGhpcy5UZz0iIjtkJiZkLmVtcHR5P3RoaXMuQXMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5rbj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5rZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPQohMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bS55YShtLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVmEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlKXthPWUucGcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uSmQoYSkpKyImdHlwZT1qcyIsYj1tLnlhKG0uSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0ueWEobS5KZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnpzLmJpbmQodGhpcyksdGhpcy53cy5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkdhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5DYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuQ2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkNifHx0aGlzLmJzKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLm52KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGJzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0senM6ZnVuY3Rpb24oYSl7dGhpcy5adChhKTt0cnl7dGhpcy5HYT1hLnJlc3BvbnNlWE1MLHRoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOgpHLkpmfSkpfSxBczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWWQpKX10aGlzLlk9dGhpcy5FZygpO3RoaXMudGM9dGhpcy5yZigpO3RoaXMucmM9dGhpcy5VaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5KYygpOnRoaXMuc2EodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkJmP0cuWGQ6Ry5KZn0pKX0sd3M6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5JZix7ZGVwdGg6YX0pKX0sSmM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5kcygpP3RoaXMueXYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMuUnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMuY3coKSYmdGhpcy5XZSh0aGlzLlJwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPwoodGhpcy50Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5SZSgpfSxxaDpmdW5jdGlvbigpe3RoaXMucmM/KHRoaXMucmM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSmMoKSk6dGhpcy5wYXJlbnQucWgoKX0sY3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52digpP3RoaXMudXYoKT8hMDooLTEhPXRoaXMuRGMoKT90aGlzLnNhKHRoaXMuU2Eody5UZCkpOnRoaXMuc2EodGhpcy5TYSh3LkVmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5TYyxHLktmKSksITEpfSxXZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5TZHx8KGEuU2Q9W10pO2EuU2QucHVzaCh0aGlzLlRnKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuQWc7dGhpcy5wYXJlbnQuV2UoYSl9LFJwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuRGMoKTthLk89dGhpcy5LZygpO2EuVmI9dGhpcy5UcSgpO2Eubnc9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5RcSgpO2EubGY9dGhpcy5ncihhLmR1cmF0aW9uKTthLmFiPWEuYWI/YS5hYjotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuQWc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLmFiPWIuYWI/Yi5hYjotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuQWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlVxKCkpOmIuUGEuY29uY2F0KHRoaXMuYnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5YYiYmdGhpcy5wYXJlbnQuWGIoYiksYT0wLHRoaXMuSmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxYYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5YYihhKX0sdWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30seXY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSx2djpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuS2coKS5sZW5ndGh9LHV2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSxVaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxadDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuQmY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sZHM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk5nKCkubGVuZ3RofSxOZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LFJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5sYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuYWgoYS5wYXJlbnROb2RlKTohMX0sYnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sVXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFRxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxGeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5wZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxncjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLmF2KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5wZChhKToiIn0scGQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLmtufHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp2PXRoaXMuYVs1XTt0aGlzLm5tPXRoaXMuYVsxXTt0aGlzLmlsPXRoaXMuYVs4XTt0aGlzLnhsPXRoaXMuYVs3XTt0aGlzLlJ3PXRoaXMuYVsxMF07dGhpcy5ObD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLlBxPWI7Yi5wcm90b3R5cGU9e0l2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kdjp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlsOnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54bDoKdGhpcy5RdyhhKX0sUXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJ3OnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlBxfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Jdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5mbT1iO2IucHJvdG90eXBlPXtLcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSwkcTpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy4kcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sa3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmZtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5UaT10aGlzLmFbOF07dGhpcy5Paz10aGlzLmFbOV07dGhpcy5lbT0KdGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzZdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuZ2s9dGhpcy5hWzRdO3RoaXMuenQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5adj1iO2IucHJvdG90eXBlPXtTaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVGk6dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk9rOnRoaXMuZG0oYSl9LGRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbTp0aGlzLkN2KGEpfSxDdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHY6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nazp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlp2fHxXYSxIYz1uZXcgV2EoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuU2koNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApneDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGh4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlB2PXRoaXMuYVs4XTt0aGlzLlZtPXRoaXMuYVs3XTt0aGlzLkRvPXRoaXMuYVsxMF07dGhpcy5QaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLkV2PWI7Yi5wcm90b3R5cGU9e092OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qdjp0aGlzLlVtKGEpfSxVbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm06dGhpcy5DbyhhKX0sQ286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkRvOnRoaXMuT2koYSl9LE9pOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuRXZ8fFhhLEljPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk92KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj0KYTt0aGlzLmpkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuRmo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkZqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KaT10aGlzLmFbMV07dGhpcy5VdD10aGlzLmFbN107dGhpcy53aT10aGlzLmFbMV07dGhpcy5jbT10aGlzLmFbNl07dGhpcy5VdT10aGlzLmFbNl07dGhpcy5HbD10aGlzLmFbMTBdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuUHI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy54bT1iO2IucHJvdG90eXBlPXtJaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSmk6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdDp0aGlzLnZpKGEpfSx2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5ibShhKX0sYm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5jbTp0aGlzLlR1KGEpfSxUdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXU6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdsOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50azp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUHI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLnhtfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5JaSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSGg9YTt0aGlzLnZpZGVvPWI7dGhpcy5QZD1bXTt0aGlzLkVoPVtdO3RoaXMuU2U9W107dGhpcy5ydz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLmpsPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLiR4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm51LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmZ1LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwpsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuUGQucHVzaCh7c3JjOmMsZnJhbWU6ZyxCdDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5TZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlNlW2JdO2MudHlwZT09PWEmJmMudXAodGhpcy5WcShhKSl9fSxWcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpeTohMCxoeTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntXeDoidmlkZW8iLGt5OiJqc0N1c3RvbSIsbHk6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbXk6MSxHeDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LGpyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5QZC5sZW5ndGg7YisrKWlmKHRoaXMuUGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5QZFtiXS5CdDtyZXR1cm4iIn0sbnU6ZnVuY3Rpb24oYSxiKXt0aGlzLkVoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLmpyKGIpLHZlbmRvcjpifSk7CnRoaXMuY3YoKX0sZnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnJ3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSx1cDpiLGZ5OiExfSl9LGN2OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS4kcnx8KGEuWngoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmp5LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS4kcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5qbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmo9dGhpcy5hWzEwXTt0aGlzLm5sPXRoaXMuYVsxXTt0aGlzLlNrPQp0aGlzLmFbNV07dGhpcy5Ecz10aGlzLmFbNV07dGhpcy5ncT10aGlzLmFbMl07dGhpcy52bD10aGlzLmFbM107dGhpcy5zbT10aGlzLmFbMl07dGhpcy5DbT10aGlzLmFbM107dGhpcy5Tbj10aGlzLmFbNF07dGhpcy5Raz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLkdzPWI7Yi5wcm90b3R5cGU9e2FqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5iajp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmw6dGhpcy5SayhhKX0sUms6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNrOnRoaXMuQ3MoYSl9LENzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy51bChhKX0sdWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52bDp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNtOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuQ206dGhpcy5SbihhKX0sUm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNuOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Razp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuR3N8fFphLEtjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLmFqKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMuZj1hO3RoaXMuamI9YS5GZygpO3RoaXMuSz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLksuaWQ9ZS5hYSgxMCk7dGhpcy5GPUUucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5jZz0hMTt0aGlzLlRiPVtdfWMub2o9YjtiLnByb3RvdHlwZT17T3E6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5PcShhKTtmb3IodmFyIGI9MCxjPTAsZT0hMSxnPXRoaXMud3IoYSksaz17fTthOyliKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGp2OmZ1bmN0aW9uKCl7dGhpcy5jZz0hMH0sZWk6ZnVuY3Rpb24oKXt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LAp3aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLnpjLHRoaXMuZi5zKCkpfSxxdTpmdW5jdGlvbigpe3RoaXMuY2d8fCh0aGlzLmYucGxheSgpLGUudihrLmZkLHRoaXMuZi5zKCkpKX0sa2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuSy5zdHlsZS56SW5kZXg9YTt0aGlzLksuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5LLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLksuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLksuc3R5bGUuYm94U2l6aW5nPXRoaXMuamIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSy5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PXRoaXMuamIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5qYik7dGhpcy5mLk1jJiZ0aGlzLmYuTWMoKT90aGlzLmYuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5LKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSx3cjpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGImJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sSXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249CmIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sYWM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JcSh0aGlzLmpiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkJlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5NYygpPyh0aGlzLksuc3R5bGUubGVmdD0iMHB4Iix0aGlzLksuc3R5bGUudG9wPSIwcHgiKToodGhpcy5LLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5LLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5LLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KwoicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLm9mKHRoaXMuSykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGFnOmZ1bmN0aW9uKGEpe3RoaXMuVGJ8fCh0aGlzLlRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5UYi5wdXNoKGEpfSxCZTpmdW5jdGlvbigpe3RoaXMuSyYmdGhpcy5LLnBhcmVudE5vZGUmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkspO3RoaXMuRiYmdGhpcy5GLnBhdXNlJiZ0aGlzLkYucGF1c2UoKX19fSkoYyk7Zm9yKHZhciAkYT1jLm9qfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtFLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FbD10aGlzLmFbN107dGhpcy54cT10aGlzLmFbMV07dGhpcy55bz10aGlzLmFbMV07dGhpcy5MbD10aGlzLmFbNF07dGhpcy5ycT10aGlzLmFbM107dGhpcy5Odz10aGlzLmFbMl07dGhpcy5Hbz10aGlzLmFbMV07dGhpcy5haz10aGlzLmFbNF07dGhpcy51bj10aGlzLmFbNl07dGhpcy5qPQp0aGlzLmFbMl19Yy5ocD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWw6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhxOnRoaXMueG8oYSl9LHhvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55bzp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGw6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJxOnRoaXMuTXcoYSl9LE13OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Odzp0aGlzLkZvKGEpfSxGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR286dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFrOnRoaXMudG4oYSl9LHRuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJiPWMuaHB8fGJiLExjPQpuZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5EbCg0KTsoZnVuY3Rpb24oYyl7Yy5TbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5XKGEpO3RoaXMuRGQoYik7dGhpcy5xZygpfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0scWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkthKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLAphP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sRWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5LYSgpOwppZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLlNsfHxjYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuVWY9dGhpcy5XZj10aGlzLlhnPXRoaXMuZWE9dGhpcy51Zj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkVxKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51Zj0hMDt0aGlzLlhnJiZ0aGlzLmtnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsCiJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJmEuYmMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuWGc9ITA7dGhpcy5rZygpfS5iaW5kKHRoaXMpKTt0aGlzLmdnKCl9LGtnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Ipe3RoaXMuZGQoKTtpZighdGhpcy51ZiYmIXRoaXMuZGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnVmJiZ0aGlzLlVmJiYhdGhpcy5XZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGRkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpOwpyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sTGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sZ2c6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPXRoaXMuTGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5XZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlVmPWIuRHh9dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSxIeDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5VeCgpOiExfSxEYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkRjKCk6LTF9LGNyOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LEVxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlNifHwzMDI9PXRoaXMuU2I/dGhpcy5lYT0hMDp0aGlzLnUoImFkZXJyb3IiLHRoaXMuU2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOmIuRWUoKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5jcihiKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksCjJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy5SbHx8ZGI7KGZ1bmN0aW9uKGMpe2MuVGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxhczpmdW5jdGlvbigpe3dpbmRvdy5PTy5sbS5Ybi5Wbj93aW5kb3cuT08ubG0uWG4uVm4uQngoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYXMoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS55ZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgY2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IGRiKGMsCnRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy5UbHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ0PXRoaXMuYVs1XTt0aGlzLnZ3PXRoaXMuYVs4XTt0aGlzLllwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzhdfWMuYXE9YjtiLnByb3RvdHlwZT17YXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJ0OnRoaXMudXcoYSl9LHV3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52dzp0aGlzLlhwKGEpfSxYcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWXA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLmFxfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuYXQoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLnpoKCl9LHpoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ZaXx8aGI7KGZ1bmN0aW9uKGMpe2MuWGk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0saGc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucmEoKTp0aGlzLm0oKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuaGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sQ2g6ZnVuY3Rpb24oYil7Yj1uZXcgaGIoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fChiLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlIoYiksKG5ldyBpYihiLHRoaXMuSSkpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZxfHwodGhpcy5GcT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuQ2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkNoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7CnRoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuWml8fGpiLFQ9bmV3IGpiKHIpO1QuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZ3PXRoaXMuYVsxXTt0aGlzLlFsPXRoaXMuYVsxXTt0aGlzLnFzPXRoaXMuYVs2XTt0aGlzLkF2PXRoaXMuYVsxMF07dGhpcy5paz10aGlzLmFbMV07dGhpcy5ycD10aGlzLmFbOV07dGhpcy5idT10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLkFpPWI7Yi5wcm90b3R5cGU9e1V3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Wdzp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFsOnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xczp0aGlzLnp2KGEpfSx6djpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQXY6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5pazp0aGlzLnFwKGEpfSxxcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJwOnRoaXMuYXUoYSl9LGF1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5idTp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkFpfHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5Vdyg0KTsoZnVuY3Rpb24oYyl7Yy5ObT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuTm18fFU7KGZ1bmN0aW9uKGMpe2MuTW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guWWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlljKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuJHMoYSl9LmJpbmQodGhpcykpO3guWWMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5ZYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3gucXIoKX0sJHM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwKMzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLk1tfHxWOyhmdW5jdGlvbihjKXtjLk9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTsKdGhpcy53ZCYmKGI9ZS5WcChiLHRoaXMud2QpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLndkfHwodGhpcy53ZD1bXSksdGhpcy53ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWWM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8Cih0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LEJ2OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5wdSgpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxxcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9CmEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5CdihiKX19KX0pKGMpO3ZhciBsYj1jLk9tfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpuPXRoaXMuYVsxXTt0aGlzLldrPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMudHc9YjtiLnByb3RvdHlwZT17aG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuVmsoYSl9LFZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuV2s6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYj1jLnR3fHxtYixPYz1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy5obig0KTsoZnVuY3Rpb24oYyl7Yy5VaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxBYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuVWl8fG5iOyhmdW5jdGlvbihjKXtjLlZpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMudSgibm9BZCIsInBsYXllZCIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLlZpfHxvYjsoZnVuY3Rpb24oYyl7Yy5XaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpOwppZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBuYihkKTt0aGlzLk4oZyl8fCh0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLldpfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1wPXRoaXMuYVs1XTt0aGlzLmVxPXRoaXMuYVs3XTt0aGlzLkp0PXRoaXMuYVs0XTt0aGlzLlVrPXRoaXMuYVs2XTt0aGlzLmduPXRoaXMuYVs4XTt0aGlzLndtPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuUXU9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1wOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lcTp0aGlzLkl0KGEpfSxJdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSnQ6dGhpcy5UayhhKX0sVGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVrOnRoaXMuZm4oYSl9LGZuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbjp0aGlzLnZtKGEpfSx2bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj0KYy5RdXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMubHAoNCk7KGZ1bmN0aW9uKGMpe2MuSWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuZXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZXU6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJgphLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFlnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuSWx8fHNiOyhmdW5jdGlvbihjKXtjLkhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLkhsfHx0YjsoZnVuY3Rpb24oYyl7Yy5KbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9CmwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5KbHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZmo9dGhpcy5hWzddO3RoaXMuUHM9dGhpcy5hWzNdO3RoaXMuc3U9dGhpcy5hWzZdO3RoaXMuZng9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy5Hcj1iO2IucHJvdG90eXBlPXtlajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmo6dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBzOgp0aGlzLnJ1KGEpfSxydTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnN1OnRoaXMuZXgoYSl9LGV4OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5meDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuR3J8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmVqKDQpOyhmdW5jdGlvbihjKXtjLnFuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMucW58fAp3YjsoZnVuY3Rpb24oYyl7Yy5wbj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxZYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sY3U6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5jdSh0aGlzLkNhKToodGhpcy5DYT10aGlzLlliKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpO3JldHVybn1pZighdGhpcy51Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZiLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmZiW2FdJiYzMDMhPXRoaXMuZmJbYV0mJjQwMyE9dGhpcy5mYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKNTAwKX19KX0pKGMpO3ZhciB4Yj1jLnBufHx4YjsoZnVuY3Rpb24oYyl7Yy5ybj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMucm58fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MbT10aGlzLmFbMV07dGhpcy5HcD10aGlzLmFbMV07dGhpcy5SbT10aGlzLmFbOV07dGhpcy5Rbj10aGlzLmFbOV07CnRoaXMua3E9dGhpcy5hWzEwXTt0aGlzLnp1PXRoaXMuYVs2XTt0aGlzLnVvPXRoaXMuYVsyXTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzJdfWMuY249YjtiLnByb3RvdHlwZT17S206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxtOnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HcDp0aGlzLlFtKGEpfSxRbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUm06dGhpcy5QbihhKX0sUG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlFuOnRoaXMuanEoYSl9LGpxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcTp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuenU6dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVvOnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT8KdGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLmNufHxBYixSYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5LbSg0KTsoZnVuY3Rpb24oYyl7Yy56bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5YZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuTHQoKX0uYmluZCh0aGlzKSw1MDApfSxMdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJgphJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5YZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5YZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxmdjpmdW5jdGlvbigpe3RoaXMuWGU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBCYj1jLnptfHxCYjsoZnVuY3Rpb24oYyl7Yy55bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubGM9MH0sZzpmdW5jdGlvbigpe3RoaXMuRnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmxjfHwodGhpcy5sYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5sY3x8dGhpcy5sYysrLHRoaXMubGM8PXRoaXMuRnM/KHRoaXMubGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLmZ2KCksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBDYj1jLnltfHxDYjsoZnVuY3Rpb24oYyl7Yy5BbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgQ2IoYix0aGlzLkkpKS5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBEYj1jLkFtfHxEYixFYj1uZXcgRGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnE9dGhpcy5hWzZdO3RoaXMubHQ9dGhpcy5hWzNdO3RoaXMuSGk9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy50dD1iO2IucHJvdG90eXBlPXt1cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnE6dGhpcy5rdChhKX0sa3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmx0OnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLnR0fHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1TYy51cSg0KTsoZnVuY3Rpb24oYyl7Yy5wbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLnBtfHxHYjsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzsKYSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLkxwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMub2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnNzKCk6dGhpcy5qZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LExwOmZ1bmN0aW9uKCl7dGhpcy5TZigpfHx0aGlzLm0oITApfSxzczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm9kKCk7IWIucWEmJmIuWSYmYi5BeCYmYi5DeCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoKX0uYmluZCh0aGlzKSwxMDApfSxvZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVoKWZvcih2YXIgYj1sLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLmlkLApjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudWg9YltjXSk7cmV0dXJuIHRoaXMudWh9LFZ4OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLm9kKCkuYWRzTG9hZGVyP3RoaXMuRyghMCk6dGhpcy5HKCk6dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEhiPWMub218fEhiOyhmdW5jdGlvbihjKXtjLnFtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwucGxheWVyYXBpKXt2YXIgYj1sLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgSGIoYyx0aGlzLkkpKS5nKCkpfXJldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgSWI9Yy5xbXx8SWIsSmI9bmV3IEliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNqPXRoaXMuYVszXTt0aGlzLnduPXRoaXMuYVs0XTt0aGlzLlNqPXRoaXMuYVs1XTt0aGlzLktxPXRoaXMuYVs2XTt0aGlzLkRpPXRoaXMuYVs4XTt0aGlzLnNvPXRoaXMuYVs3XTt0aGlzLldvPXRoaXMuYVs2XTt0aGlzLnppPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzZdfWMucnM9YjtiLnByb3RvdHlwZT17Qmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNqOnRoaXMudm4oYSl9LHZuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud246dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNqOgp0aGlzLkpxKGEpfSxKcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS3E6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRpOnRoaXMucm8oYSl9LHJvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zbzp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV286dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56aTp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnJzfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5Caig0KTsoZnVuY3Rpb24oYyl7Yy5mbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxUeDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxNYzpmdW5jdGlvbigpe3JldHVybiEwfSxLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9CmMuZmx8fFg7KGZ1bmN0aW9uKGMpe2MuZGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlllJiZiIT10aGlzLlllfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLmF5KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuZGx8fFk7KGZ1bmN0aW9uKGMpe2MuZ2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5uYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuZ2x8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY2s9dGhpcy5hWzEwXTt0aGlzLiRwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuRW89YjtiLnByb3RvdHlwZT17Yms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmNrOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuRW98fE5iLFVjPW5ldyBOYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5iayg0KTsoZnVuY3Rpb24oYyl7Yy5Qaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LEF1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LApBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5Qanx8T2I7KGZ1bmN0aW9uKGMpe2MuT2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5Panx8UGI7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpOwp2YXIgUWI9Yy5Ranx8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs2XTt0aGlzLkZtPXRoaXMuYVsyXTt0aGlzLmNsPXRoaXMuYVsxXTt0aGlzLlN1PXRoaXMuYVs2XTt0aGlzLld0PXRoaXMuYVs0XTt0aGlzLldsPXRoaXMuYVs3XTt0aGlzLnZ0PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzZdfWMuRnQ9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRsOnRoaXMuRW0oYSl9LEVtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GbTp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5SdShhKX0sUnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlN1OnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV3Q6dGhpcy5WbChhKX0sClZsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbDp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLkZ0fHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Fbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSwKTmQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LGR1OmZ1bmN0aW9uKCl7dGhpcy5SYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJjfHwodGhpcy5SYz0hMCx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5OZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxBYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuRW58fFRiOyhmdW5jdGlvbihjKXtjLkRuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LERoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSwKYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VYihhKX0uYmluZCh0aGlzKSkpLGImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5EaC5iaW5kKHRoaXMpLDEwKX0sVWI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT0KYS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxPZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5VYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuT2YoKTt0aGlzLmd1KCl9LGd1OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGIpe3RoaXMuVWIoYil9KX0sbTpmdW5jdGlvbihiKXt0aGlzLiR0P3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihiKXt0aGlzLiR0PSEwO2lmKGImJmIuZGV0YWlsKWZvcih2YXIgYSBpbiBiLmRldGFpbCkiYWRUYWdVcmwiPT1hJiYoYi5kZXRhaWxbYV18fHRoaXMuVWIoYikpfX0pfSkoYyk7dmFyIFViPWMuRG58fFViOyhmdW5jdGlvbihjKXtjLkZuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIuZHUoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpOwp2YXIgVmI9Yy5Gbnx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLlluPWI7Yi5wcm90b3R5cGU9e2pzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLllufHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy5qcyg0KTsoZnVuY3Rpb24oYyl7Yy5abT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLnhoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT0KYi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLk5zPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxBdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTnN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy54aCYmCih0aGlzLnhoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy5abXx8TzsoZnVuY3Rpb24oYyl7Yy5ZbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuTXUoKTp0aGlzLm0oITApLCEwO3RoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubSgpOnRoaXMubSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnVlPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlM9CnRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLlltfHxQOyhmdW5jdGlvbihjKXtjLiRtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwKKHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuY2YoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLiRtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMucms9dGhpcy5hWzZdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy5Xdj1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSHQ6CnRoaXMucWsoYSl9LHFrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5yazp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Xdnx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuR3QoNCk7KGZ1bmN0aW9uKGMpe2MuSms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ka3x8WjsoZnVuY3Rpb24oYyl7Yy5Jaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5yYigpLCEwO3RoaXMuVWcrKztpZigxMDx0aGlzLlVnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0KITB9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLklrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Laz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLktrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY3A9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzldO3RoaXMuTm49dGhpcy5hWzZdO3RoaXMuS3I9dGhpcy5hWzVdO3RoaXMuSG49dGhpcy5hWzRdO3RoaXMucHE9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5saz1iO2IucHJvdG90eXBlPXticDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY3A6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5lazp0aGlzLk1uKGEpfSxNbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTm46dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktyOnRoaXMuR24oYSl9LEduOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Ibjp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLmxrfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5icCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJgphPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Nanx8ZGM7KGZ1bmN0aW9uKGMpe2MuTGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaWcoKX0saWc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLkxqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Oaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLk5qfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHQ9dGhpcy5hWzldO3RoaXMucmo9dGhpcy5hWzZdO3RoaXMuQnI9dGhpcy5hWzNdO3RoaXMuS3M9dGhpcy5hWzNdO3RoaXMuV3U9dGhpcy5hWzEwXTt0aGlzLkpuPXRoaXMuYVs1XTt0aGlzLnB0PXRoaXMuYVs2XTsKdGhpcy5qPXRoaXMuYVsxMF19Yy5zdD1iO2IucHJvdG90eXBlPXtjdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZHQ6dGhpcy5xaihhKX0scWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnJqOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ccjp0aGlzLkpzKGEpfSxKczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3M6dGhpcy5WdShhKX0sVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLld1OnRoaXMuSW4oYSl9LEluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kbjp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucHQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLnN0fHxoYyxaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9WmMuY3QoNCk7KGZ1bmN0aW9uKGMpe2Mucmk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMucml8fGljOyhmdW5jdGlvbihjKXtjLnBpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGZnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5mZy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnBpfHxqYzsoZnVuY3Rpb24oYyl7Yy5zaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9Cm5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnNpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQW89dGhpcy5hWzJdO3RoaXMuRWo9dGhpcy5hWzRdO3RoaXMuQ2w9dGhpcy5hWzhdO3RoaXMuVG09dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzddO3RoaXMuaj0KdGhpcy5hWzNdfWMuUXM9YjtiLnByb3RvdHlwZT17em86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkFvOnRoaXMuRGooYSl9LERqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fajp0aGlzLkJsKGEpfSxCbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2w6dGhpcy5TbShhKX0sU206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRtOnRoaXMuSm8oYSl9LEpvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMuUXN8fG1jLCRjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLnpvKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdOwp0aGlzLmJmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj8KbnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcWI/bnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLmhtPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuZHIoYSk6W10sYjt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107CnRoaXMueGYoYikmJih0aGlzLnpkLnB1c2goYiksdGhpcy5KaChiKSl9fSx4ZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmJmW2NdLHRoaXMueGYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5nKCl9LGh2OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG5jPWMuaG18fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5RcD10aGlzLmFbMV07dGhpcy5Gaz10aGlzLmFbN107dGhpcy5NcT10aGlzLmFbMTBdO3RoaXMuTXM9dGhpcy5hWzddO3RoaXMuWXU9dGhpcy5hWzZdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMueWo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5ncD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUXA6dGhpcy5FayhhKX0sRWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZrOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5NcTp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTXM6dGhpcy5YdShhKX0sWHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLll1OnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cjp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5ncHx8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9YWQuUHAoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQ2Moay5kdyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywKITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkNjKGsuV3MpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgYmQ9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLlpnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWmcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTsKSS5rYSgpO3ZhciBjZD1iZChmdW5jdGlvbigpe2Uuemcod2luZG93LEkuUXIoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhxPXRoaXMuYVs3XTt0aGlzLll2PXRoaXMuYVs0XTt0aGlzLmJvPXRoaXMuYVszXTt0aGlzLm5yPXRoaXMuYVs3XTt0aGlzLmpqPXRoaXMuYVs0XTt0aGlzLlFvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMuQm89YjtiLnByb3RvdHlwZT17R3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYm86dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5yOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuamo6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5Cb3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuR3EoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnloPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy51ZD0wO3RoaXMuZWI9IiI7dGhpcy5BZD1bXTt0aGlzLkJkPTA7dGhpcy5BaD0hMTt0aGlzLlplPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnRpPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3RoaXMueWg9YX0saGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKRHU6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSxOYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5iYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLlRyKCkpdGhpcy5uYi5sKHRoaXMubmIucWQsCnRoaXMubmIud2EsdGhpcy5uYi5hZixmdW5jdGlvbigpe3RoaXMuTmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLkJjKTtlbHNlIGlmKHRoaXMuc3IoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmp2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm5iLGcpO2wuQnUodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkVzKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJgooYz10aGlzLnBsYXllci5KZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5MZShhLGMsZik7dGhpcy5wbGF5ZXIuTGgobCl9fSxUcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnVkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yj8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LCR1OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UuZ2YoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX0sWnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueWgpe2UuZ2YoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLkl1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnZnKGMpKT90aGlzLk5jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LGp1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuT3UodGhpcy5adS5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuTmEoKX0sRmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZ2YoIm1pZHJvbGwiKTtpZighdGhpcy5uaCl7dGhpcy5uaD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5OYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX19LGl1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHUodGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy4kdSgpO3RoaXMucGxheWVyLk9lJiZ0aGlzLml1KCk7dGhpcy5qdSgpfSxrdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5BZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuV3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxzcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSx2dTpmdW5jdGlvbihhKXt0aGlzLkFoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuUHQuYmluZCh0aGlzKSl9LFB0OmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLlplLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy5BaCgpfSxFczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5aZS5sZW5ndGg7YysrKWI9CnRoaXMuWmVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubXY9dGhpcy5hWzRdO3RoaXMuS2o9dGhpcy5hWzNdO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnRxPXRoaXMuYVs1XTt0aGlzLlR3PXRoaXMuYVszXTt0aGlzLmZ0PXRoaXMuYVs4XTt0aGlzLlR2PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzldfWMuUG09YjtiLnByb3RvdHlwZT17bHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm12OnRoaXMuSmooYSl9LEpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2o6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMuc3EoYSl9LHNxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6CnRoaXMuU3coYSl9LFN3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udzp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZnQ6dGhpcy5TdihhKX0sU3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Udjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuUG18fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLmx2KDQpfSkuY2FsbChhdUZlZXNodWVlWWFpeW9vLGF1RmVlc2h1ZWVZYWl5b28pOwo=
- 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
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
263ms
89ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=aa3f9f13-d188-f774-462c-bfeac6392bb9&tv={c:sjga0u,pingTime:-2,time:47,type:a,im:{sf:0,pom:1,prf:{mdA:2,mdZ:84,beA:87,beZ:89,mfA:90,cmA:90,inA:91,inZ:95,prA:95,prZ:102,si:107,poA:108,poZ:112,cmZ:112,mfZ:112,loA:120,loZ:121,ltA:134,ltZ:134}},sca:{dfp:{df:4,sz:300.250,dom:ins}},env:{gca:0},clog:[{piv:100,vs:i,r:,w:300,h:250,t:19}],es:0,sc:1,ha:1,gm:0,slTimes:{i:47,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:19,wc:0.0.1600.1200,ac:968.138.300.250,am:i,cc:968.138.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[42~100],as:[42~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:0,fm:rGa7D15+11|12|1311|1312|1313|14|151|1611|17|18|19|1a|1b|1c|1d|1e|1f|1g|1h|1i|1j*.346702-39754020|1k,idMap:1j*,rend:0,renddet:WINDOW,rmeas:0,slid:[google_ads_iframe_4444/giga.de_sd/software_artikel_3,google_ads_iframe_4444/giga.de_sd/software_artikel_3__container__,sdgAdServerContainer-rectangle,rectangle-4],sinceFw:26,readyFired:true}&br=u
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
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
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame E2F6
|
653 B
1 KB
|
7ms
7ms
|
XHR
application/json |
13.224.196.127
Amazon.com
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=7490094756
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGF1RmVlc2h1ZWVZYWl5b289YXVGZWVzaHVlZVlhaXlvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5wcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5EdShtKTthLkN1KGwpO2Eua3UoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5MdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXQ9dGhpcy5hWzVdO3RoaXMuTG49dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLnFvPWI7Yi5wcm90b3R5cGU9e1h0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZdDp0aGlzLktuKGEpfSxLbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTG46dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndvOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5GaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMucW98fGhhLHNjPQpuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5YdCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5wcD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuT3QuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5Waj1iO2IucHJvdG90eXBlPXtpdjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTsKdGhpcy5vYlthXSs9MTs1PHRoaXMub2JbYV0mJiF0aGlzLlNnW2FdJiYodGhpcy5TZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLml2KCksITApKX0sb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sb286ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSwKe3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxPdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5OdChhLmRhdGEpfSxOdDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9CkpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sSGc6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbW86ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLk5xKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PQpiLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LE5xOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxjczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9CmFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sb2Y6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOgohMTohMX0sRmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3E9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmUoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYKMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09CnR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eT1rO3U9bTtyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHEsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChxLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7Cm09bSt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihtKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxxPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sWnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxrZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17UWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sJGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCnhyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LHNuOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxhbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LEhtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sWW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5RaSgpfHxhLiRpKCl8fGEueHIoKXx8YS5VbCgpfHxhLnNuKCl8fGEuYWwoKXx8YS5IbSgpfX07cmV0dXJuIG51bGwhPWEuWW8oKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpOwp2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxmcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sVnA6ZnVuY3Rpb24oYSwKYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LGF2OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj0KYX0semc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5DYjt0aGlzLmVlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sUXQ6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJgoxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5mcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGJ2OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9CnRoaXMuWmIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmVlKGEpfSxlZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlF0KGEpO2lmKGIpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKGIpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTWQ6ZnVuY3Rpb24oYSl7aWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLnpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuY3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8CnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMueGcoYSkpcmV0dXJuIHRoaXMueGcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSwKZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnNkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLm1vKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIGw9ZXx8bTtlPSEwO2smJihlPSExKTtpZihsJiZsLlYpaWYobC5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLApjLGwsZyxrKX0uYmluZCh0aGlzKSw1MDApfSxraDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5czpmdW5jdGlvbihhLApiLGQpe3RoaXMua2goYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuT2MpZm9yKHZhciBjIGluIHRoaXMuT2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5PY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5iYihhLGYuTGEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnlzKGYuc2QoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEx1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LFd3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIiwKZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxhcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sWHI6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0KMDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLlZqfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlVqPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuQ3Q9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuS3c9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi55cT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLllmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlFmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuY289e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07CmIuaXc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlVzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnpxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Pdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLk5wPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5mZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTsKYi56Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuWGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLmZvPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5YYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLmVvPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTsKYi5Ycz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnZkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuSnc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZXc9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmZ3PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Xcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5Vanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs2XX1jLnBqPWI7Yi5wcm90b3R5cGU9e0Z2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIGphPWMucGp8fGphLHZjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Gdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLldqPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxsYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sYXI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrCm5hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG5kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5uZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm5kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sa2E6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLmxhKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm5kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxRcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuYXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5uZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9Yy5Xanx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50cD10aGlzLmFbNV07dGhpcy5rbT10aGlzLmFbOF07dGhpcy4kbz10aGlzLmFbN107dGhpcy5OaT10aGlzLmFbOF07dGhpcy4kdz10aGlzLmFbMV07dGhpcy5sdz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs3XX0KYy5ucT1iO2IucHJvdG90eXBlPXtzcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudHA6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmttOnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbzp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmk6dGhpcy5adyhhKX0sWnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR3OnRoaXMua3coYSl9LGt3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMubnF8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLnNwKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CnZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5raj1ifSkoYyk7dmFyIEw9Yy5ranx8Ckw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ249dGhpcy5hWzddO3RoaXMuSGs9dGhpcy5hWzhdO3RoaXMuRXQ9dGhpcy5hWzddO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMub3M9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbN119Yy5SaT1iO2IucHJvdG90eXBlPXtCbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ246dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkhrOnRoaXMuRHQoYSl9LER0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FdDp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubmo6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5SaXx8bGEseGM9bmV3IGxhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLkJuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuZ209TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5NYT17fTt0aGlzLkk9bnVsbDt0aGlzLkxjPTEwMDt0aGlzLkliPTA7dGhpcy5XYT0xNTA7dGhpcy5MYj0wO3RoaXMuRXUoYil9LGc6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhPyh0aGlzLkliKyssdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkxjKSk6MD50aGlzLldhJiYodGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkxjKSl9LHB1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWI+dGhpcy5XYT8hMDohMX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLkliPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKRXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuUCgpLCEwKTt0aGlzLk1hW2IubGEoKV09YjtNJiZNLmhoJiZNLmh2KGIpfSxOeDpmdW5jdGlvbigpe3JldHVybiBlLnllKHRoaXMuTWEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX0sWXI6ZnVuY3Rpb24oYil7Yj1iLkthKCk7Zm9yKHZhciBhIGluIHRoaXMuTWEpaWYoYi5pZD09dGhpcy5NYVthXS5LYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxleTpmdW5jdGlvbihiKXt0aGlzLk1hW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLmdtfHx0OyhmdW5jdGlvbihjKXtjLmltPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9CnRoaXMuaWQ9bnVsbDt0aGlzLkxjPTEwO3RoaXMuSWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubmE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkJiPSIiO3RoaXMucmc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5LYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxNOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30sT3U6ZnVuY3Rpb24oYil7dGhpcy5YPWJ9LE94OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sSHU6ZnVuY3Rpb24oYil7dGhpcy5QZT1ifSxNeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlfSxPZTpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2EmJih0aGlzLkliKyssCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTGMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sRmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sCmxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sZ3k6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMudHIoKXx8dGhpcy5pbygpO3RoaXMuRGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxQeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxpbzpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5hYSgxMCkpfSx0cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sVzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxLYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFZTpmdW5jdGlvbigpe3JldHVybiEwfSwKaXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFh4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmF9LGNhOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMH0sTWM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExoOmZ1bmN0aW9uKGIpe3RoaXMuQmI9Yn0sTHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPQpudWxsfSxSeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuQmImJihiPSEwKTtyZXR1cm4gYn0sYnk6ZnVuY3Rpb24oKXt0aGlzLnJnfHwodGhpcy5yZz0hMCl9LHZlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEl4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLmltfHxwOyhmdW5jdGlvbihjKXtjLnVpPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5JPXRoaXMucGxheWVyPSIiO3RoaXMuTWY9IjEiO3RoaXMuTmY9IjIiO3RoaXMuV249IjMiO3RoaXMuVGM9MDt0aGlzLm9oPTMwO3RoaXMuUmI9W107dGhpcy5oYj1bXTt0aGlzLnBjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLiRmPXRoaXMuZ2k9ITE7dGhpcy5zdGF0dXM9dGhpcy5UYzsKdGhpcy5pZD1lLmFhKDEwKTt0aGlzLmhmKGIpO3RoaXMuRnUoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5naXx8KHRoaXMuZ2k9ITAsZS5NZSgpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmJjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxOcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5rYSgpXXx8KHdpbmRvd1thLmthKCldPXt9KTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldfHwod2luZG93W2Eua2EoKV1bYi5sYSgpXT17fSx3aW5kb3dbYS5rYSgpXVtiLmxhKCldLmluaXRpYXRvcj1lLlpiKCkpO3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT93aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV0rKzp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV09MX0sVnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLAphPSEwLGg9bmV3IEo7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0uaW5pdGlhdG9yIT1lLlpiKCkmJih0aGlzLmpmKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMueGEoKSl7dGhpcy5OcigpO2lmKCF0aGlzLlZyKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmpmKCk7cmV0dXJufXRoaXMuamYoKTt0aGlzLkkodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLiRoKCk7dGhpcy4kZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSx1OmZ1bmN0aW9uKGIsYSl7dGhpcy54YSgpfHwodGhpcy5SYi5wdXNoKGIpLHRoaXMuaGIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5SYiYmMDx0aGlzLlJiLmxlbmd0aCYmKHRoaXMuUmI9CmUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaGIpe2Zvcih2YXIgaD0wO2g8dGhpcy5oYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5oYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5oYltoXS5yZWFzb25dPHRoaXMucGNbYl0mJihhPVtdLGEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksYj10aGlzLmhiW2hdLnJlYXNvbik7dGhpcy5wY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LFF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZ9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxqZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTmZ9LE11OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuV259LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTWZ9LHl4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk5mfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30saGY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxGdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0sWnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxCczpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMudWl8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3A9dGhpcy5hWzZdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuJGs9dGhpcy5hWzZdO3RoaXMuYng9dGhpcy5hWzEwXTt0aGlzLmlxPXRoaXMuYVs2XTsKdGhpcy5kaj10aGlzLmFbOV07dGhpcy5keD10aGlzLmFbOV07dGhpcy5Gcj10aGlzLmFbOF07dGhpcy5mcz10aGlzLmFbM107dGhpcy5Vbz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkdtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3A6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnByOnRoaXMuWmsoYSl9LFprOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy4kazp0aGlzLmF4KGEpfSxheDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYng6dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlxOnRoaXMuY2ooYSl9LGNqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZGo6dGhpcy5jeChhKX0sY3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR4OnRoaXMuRXIoYSl9LEVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gcjp0aGlzLmVzKGEpfSxlczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5mczp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLkdtfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ucCg0KTsoZnVuY3Rpb24oYyl7Yy5Haj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Hanx8b2E7KGZ1bmN0aW9uKGMpe2MuSGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLnp4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPwoodGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuSGp8fHBhOyhmdW5jdGlvbihjKXtjLklqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pOwp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Janx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNxPXRoaXMuYVs5XTt0aGlzLnVzPXRoaXMuYVsxMF07dGhpcy5KbT10aGlzLmFbMTBdO3RoaXMuTXI9dGhpcy5hWzEwXTt0aGlzLmJ3PXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMueWw9YjtiLnByb3RvdHlwZT17QnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNxOnRoaXMudHMoYSl9LHRzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51czp0aGlzLkltKGEpfSxJbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkptOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ncjp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy55bHx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQnEoNCk7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuTXA9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMueWt8fHNhOyhmdW5jdGlvbihjKXtjLnhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UYzt0aGlzLmlzUGxheWluZz10aGlzLlZjPSExO3RoaXMuYmU9MTt0aGlzLldjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlZjPSExO3RoaXMuYmU9MTt0aGlzLldjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5NcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueWQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlZjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5XYy5pbmRleE9mKGEpJiZ0aGlzLldjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuV2MubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LEJzOmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5WY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMueGt8fHRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuV3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5ZcihoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LEt4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFdxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy56a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sdj10aGlzLmFbNV07dGhpcy52aj10aGlzLmFbOV07dGhpcy5TdD10aGlzLmFbNF07dGhpcy5waz10aGlzLmFbMV07dGhpcy51dT10aGlzLmFbMl07dGhpcy5tcz10aGlzLmFbNV07dGhpcy5Caz10aGlzLmFbNF07dGhpcy5tcT10aGlzLmFbMV07dGhpcy51bT10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVszXX1jLndqPWI7Yi5wcm90b3R5cGU9e1F2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Sdjp0aGlzLnVqKGEpfSx1ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmo6dGhpcy5SdChhKX0sUnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlN0OnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wazp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1zOgp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQms6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1xOnRoaXMudG0oYSl9LHRtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMud2p8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlF2KDQpOyhmdW5jdGlvbihjKXtjLm1uPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSwKYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5tbnx8eGE7KGZ1bmN0aW9uKGMpe2MubG49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5GYz10aGlzLkNhPXRoaXMuJGM9ITE7dGhpcy5CaD1lLkhiKDEwKTt0aGlzLmZpPSEwO3RoaXMudWM9dGhpcy5XZz0hMTt0aGlzLlRzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5yaCgpLHRoaXMudnAoKSx0aGlzLnJiKCkpfSxUczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxjeTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkubGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi4kZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkouaWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5pZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkJoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFliOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSmc6ZnVuY3Rpb24oKXtpZighdGhpcy5GYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkZjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5GYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkZjfSxXcjpmdW5jdGlvbigpe2lmKCF0aGlzLlZnKXt2YXIgYj10aGlzLnliKCksYT10aGlzLlVyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5WZz0hMCl9cmV0dXJuIHRoaXMuVmd9LFVyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuJGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLiRjPSEwKTtyZXR1cm4gdGhpcy4kY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlliKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuaHUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksCjIwKX0saHU6ZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3ZhciBiPXRoaXMuSmcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnZjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApfSxKeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmIuYWRzJiYodGhpcy5vZz1iLmFkcyk7cmV0dXJuIHRoaXMub2d9LHZwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2EoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuSmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSw1MCkpfSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuV3IoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5ZYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5ZYigpLHRoaXMudWN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMueWIoKX1lbHNlIHRoaXMuV2c/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCksYj10aGlzLlliKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuV2c9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yaCgpfS5iaW5kKHRoaXMpLAo1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHdwOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud3AoKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5maT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5maSxmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sRHA6ZnVuY3Rpb24oKXt0aGlzLlN4fHwoMTA8dGhpcy53dz8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnd3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMub3UoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRHAoKX0uYmluZCh0aGlzKSwKNTApKSl9LG91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnh3KXt0aGlzLnh3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMubG58fHlhOyhmdW5jdGlvbihjKXtjLm5uPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS55ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpfX0pfSkoYyk7dmFyIHphPWMubm58fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbMTBdO3RoaXMuanA9dGhpcy5hWzRdO3RoaXMuU3I9dGhpcy5hWzZdO3RoaXMuWnM9dGhpcy5hWzVdOwp0aGlzLkFqPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs4XX1jLkx3PWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpwOnRoaXMuUnIoYSl9LFJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Tcjp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnM6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLkx3fHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9QmMuYW4oNCk7KGZ1bmN0aW9uKGMpe2MuWWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxLdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5iYyYmKDA8PWguaW5kZXhPZihkKXx8YS55ZCgpKX0sCnBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKToKd2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuWWx8fENhOyhmdW5jdGlvbihjKXtjLlhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9CjApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5EcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLkRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuS3QoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuWGx8fERhOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLlpsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanQ9dGhpcy5hWzNdO3RoaXMuU3M9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzhdO3RoaXMueHQ9dGhpcy5hWzhdO3RoaXMucmw9dGhpcy5hWzldO3RoaXMubGw9dGhpcy5hWzddO3RoaXMuSW89dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbM119Yy5icT1iO2IucHJvdG90eXBlPXtpdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanQ6dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNzOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wbDp0aGlzLnd0KGEpfSx3dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueHQ6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLmxsOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Jbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuYnF8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLml0KDQpOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkdnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMuTXQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD0KYi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5NdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmxkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5sZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubGQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxDcDpmdW5jdGlvbigpe2UuYmgodGhpcy5sZCk7CmUuRmUodGhpcy5sZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy52a3x8SGE7KGZ1bmN0aW9uKGMpe2MudWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMudWt8fElhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkdnKGIsImVsZW1lbnRJRCIpO2lmKGUuYmgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9ZWxzZSB0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLndrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuQWw9dGhpcy5hWzFdO3RoaXMuSXI9dGhpcy5hWzNdO3RoaXMueHU9dGhpcy5hWzRdO3RoaXMuRHI9dGhpcy5hWzZdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueW49dGhpcy5hWzddO3RoaXMuTW89dGhpcy5hWzVdO3RoaXMuWWs9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzVdfWMueGk9YjtiLnByb3RvdHlwZT17cXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ0OnRoaXMuemwoYSl9LHpsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWw6dGhpcy5IcihhKX0sSHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Jcjp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueHU6dGhpcy5DcihhKX0sQ3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkRyOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLnhuKGEpfSx4bjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW46dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1vOnRoaXMuWGsoYSl9LFhrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMueGl8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnF0KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9CmE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sR3U6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxqbzpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLlhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9bmV3IHooYSkpO3ZhciBjPXRoaXMuZ2I9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTsKaWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5PZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuR3UoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLllqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9CiIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5nYi5zZW5kKGEpfWNhdGNoKGYpe20mJm0uSWUodGhpcy4kYS51cmwpP20uT2Q/bS5pYSgicmVxdWVzdF9mYWlsZWQiKToKZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuWWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17S3U6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxKdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17aXg6IkFkQ2xpY2tUaHJ1IixreDoiQWRFcnJvciIsbHg6IkFkU3RvcHBlZCIsb3g6IkFkTGluZWFyQ2hhbmdlIixweDoiQWRUYWdQYXJzZWQiLHN4OiJBZFZpZGVvQ29tcGxldGUiLAp2eDoiQWRMb2FkZWQiLHd4OiJBZFNraXBwZWQiLHh4OiJBZFN0YXJ0ZWQiLG14OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsbng6IkFkSW1wcmVzc2lvbiIsang6IkFkQ3JlYXRpdmVWaWV3IixxeDoiQWRWaWRlb01pZHBvaW50IixyeDoiQWRQYXVzZWQiLHR4OiJBZFZpZGVvU3RhcnQiLHV4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LGx1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5IYSYmdGhpcy5IYS5WZClmb3IodmFyIGIgaW4gdGhpcy5IYS5WZCl0aGlzLkhhLlZkLmhhc093blByb3BlcnR5KGIpJiYKYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMubXUoKTt0aGlzLkhhJiZ0aGlzLmx1KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuV3A9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9IiI7dGhpcy5laD0hMTt0aGlzLndhPXRoaXMucWQ9IiI7dGhpcy4kZz10aGlzLlY9dGhpcy5pc0VuYWJsZWQ9dGhpcy5hZj0hMTt0aGlzLnBhPVtdO3RoaXMuUGc9dGhpcy5nYz0iIjt0aGlzLnJlPSExO3RoaXMuc2Y9MDt0aGlzLkhmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiOwp0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuS2Q9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5FcD10aGlzLlFkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9dGhpcy53Zj10aGlzLk9kPXRoaXMubGU9dGhpcy5VYz0hMTt0aGlzLmliPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnJkPTA7dGhpcy5SZz0hMTt0aGlzLlFnPTFFMzt0aGlzLmJkPSExO3RoaXMuUWE9MUUzO3RoaXMuUGY9IiJ9Yy5aaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5XcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnFkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZyxzZXJ2ZXI6dGhpcy5wYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlBnLGRpc2FibGVDb29raWVUZXN0OnRoaXMucmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuc2YsSE9NQURfVkVSSUZJRUQ6dGhpcy5IZixIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsCkhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuS2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkVwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk9kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaWIsc2l0ZUNvbmZpZzp0aGlzLkZhLHNlcnZlcklkOnRoaXMuS2gsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmtiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5OaCx2bWFwczp0aGlzLmxpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5iZCxhZEZhbGxiYWNrVVJMOnRoaXMuUGZ9fSwKcnI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxYcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsCmRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmFwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy54Y3x8dGhpcy53Ynx8dGhpcy53Y3x8dGhpcy5qZSkmJihnPXRoaXMuSXMoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ZcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Cmc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LEdjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnBhJiZ0aGlzLnBhLmxlbmd0aCYmMDx0aGlzLnBhLmxlbmd0aCYmKGI9dGhpcy5wYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9CmIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuRXg7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhW3RoaXMuS2hdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxiPXRoaXMuTWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsCmIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEhzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sQz0wO0M8Zy5sZW5ndGg7QysrKXt2YXIgaz1nW0NdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMucGgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj0KdGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LElzOmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkhzKGEsdGhpcy53YykpO3JldHVybiBhfSxCcDpmdW5jdGlvbigpe3RoaXMuRmEmJnRoaXMuRmEuY2xpZW50QVBJcyYmdGhpcy54cCh0aGlzLkZhLmNsaWVudEFQSXMpfSx4cDpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuS3UoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkp1KGEucGxheWVyKTtiLmcoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLAplKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlFkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5CcCgpO3RoaXMueHMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy52cygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSx4czpmdW5jdGlvbigpe3RoaXMuRGEobmV3IHoodGhpcy5xZCt0aGlzLmdlKCJnbG9iYWwiKSksCnRoaXMubHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sdnM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5GYSYmdGhpcy5GYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuRmEmJnRoaXMuRmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxpYTpmdW5jdGlvbihhKXtpZighdGhpcy5sZSl7dGhpcy5sZT0hMDsKdmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiYKYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpO3RoaXMuTmIoKTtlLkNjKGsuQ3QpOyhiPWUuJGIodGhpcy5zZCgpKSl8fChiPWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGxyOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPQp7fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy53YX1lbHNlIGE9dGhpcy53YTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGEuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLnBhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09CnRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuS2g9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMucGEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5nYyYmdGhpcy5MYSYmdGhpcy5wYS5sZW5ndGg/dGhpcy5IYyghMSk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPQohMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTt0aGlzLkRhKGIsdGhpcy5rdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY3VzdG9tZXIiKTthP3RoaXMuRG0/dGhpcy5pYSgibm9TVk1Db25maWciKToodGhpcy5EbT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGMoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxrdjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5PZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5pYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmtjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuS2Q9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnhjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMud2I9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuY2Q9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYmQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5lcihiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMucmUmJih0aGlzLmhjPW51bGwpO3RoaXMudGY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuSHYoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuS2QpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy5ydigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnN2KCkpfX0scnY6ZnVuY3Rpb24oKXt0aGlzLnF2KCk7dGhpcy50digpfSx0djpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmEoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5rZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuVmEoKSl7aWYodGhpcy5GYSYmdGhpcy5GYS5wbGF5ZXImJnRoaXMuRmEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7CnJldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxzdjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5VYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSxxdjpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUua2QoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmljKTsKYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy53dihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlBjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5LZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sd3Y6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMueHYoYywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSx4djpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1jO2sub25lcnJvcj1lO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy5wdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHB2OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5UaCgpOnRoaXMucWYoIkFBQSIpfSxUaDpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpOwp0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVWMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuSGYpKTt0aGlzLlFkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuUWQmJnRoaXMuUWQoKX0sQXA6ZnVuY3Rpb24oKXtpZih0aGlzLndmJiYKdGhpcy5ycigpKXt2YXIgYT10aGlzLlhxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnJkfHwodGhpcy5yZD0wKTt0aGlzLnJkKys7dGhpcy5yZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2MmJihhLm9pPSEwKTtxJiZlLlpyKCkmJihhLkJnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSx5cDpmdW5jdGlvbigpe2UuVmEoKXx8ZS5iYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuR2MoKXx8KGE9dGhpcy56YShjKSxjPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7Zy5uZXR3b3JrU3RhdGU9PQpnLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxudjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5saX0senA6ZnVuY3Rpb24oKXt0aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMuaHcuYmluZCh0aGlzKSx0aGlzLmd3LmJpbmQodGhpcykpfSxodzpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuQXEoKX0sZ3c6ZnVuY3Rpb24oKXt9LEFxOmZ1bmN0aW9uKCl7ZS5DYyhrLnpxKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmlhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxuZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuSmIubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxIdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxlcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPQphLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLlpqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5mcD10aGlzLmFbMl07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaGo9CnRoaXMuYVsxXTt0aGlzLmh0PXRoaXMuYVs4XTt0aGlzLmhzPXRoaXMuYVs1XTt0aGlzLlhtPXRoaXMuYVs3XTt0aGlzLlZ2PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzhdfWMuT2w9YjtiLnByb3RvdHlwZT17ZXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZwOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tbzp0aGlzLmdqKGEpfSxnajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaGo6dGhpcy5ndChhKX0sZ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmh0OnRoaXMuZ3MoYSl9LGdzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oczp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWG06dGhpcy5VdihhKX0sVXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5PbHx8UGEsRWM9bmV3IFBhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmVwKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy4kdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy5hZD0hMTt0aGlzLlhvPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307ZS5wYigibmV3QmlnQWRJZCIpO3RoaXMua3A9ZS5hYSgxMCk7dGhpcy5tZj0wO3RoaXMuWmM9IldlcmJ1bmcgLSBbdGltZV0iOwpjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWmM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWmM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMucG89Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkdkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5iYz0hMTt0aGlzLk9wPWUuYWEoMTApO3RoaXMuR2I9ZS5hYSgxMCk7dGhpcy5FYj1lLmFhKDEwKTt0aGlzLk9oPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLlJkPXRoaXMuT2I9dGhpcy5wZT10aGlzLmdkPXRoaXMuSWQ9CnRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubWQ9dGhpcy5Ldj10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLnhkPXt9fWMuVGo9YjtiLnByb3RvdHlwZT17QnU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLmR2KCk7ZS52KGsuZm8sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTGU6ZnVuY3Rpb24oYSxiLGMsZil7dGhpcy51Yj1jO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5BcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLG5ldyBTKHRoaXMsYSx0aGlzLm1oLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLm1jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5RYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLApjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUmQ9dGhpcy5PYj10aGlzLm1kPSExO3RoaXMuYz1hO3RoaXMuUHUodGhpcy5jKTt0aGlzLnhkPW5ldyBRYSh0aGlzLmMubncsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5IcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5IZD10aGlzLmhyKGEpKSx0aGlzLk1nKGEucGFyZW50KSl9LERnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YKYnx8KGM9dGhpcy5EZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLlNxKGEpKSk7cmV0dXJuIGN9LFNxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxocjpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxnPSIiO2lmKGEuVSl7Yj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEubGIoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpnfX0sc2E6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBiPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLmpkJiZhLmpkLmVycm9yJiZhLmpkLmVycm9yLmNvZGUmJihiPWEuamQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PQpHLlhkLmNvZGU/ZS52KGsuS3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5NZSgpLGI9PUcuS2YuY29kZSYmZS52KGsuVXMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk7ZS52KGsueXEsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmV2KCk7dGhpcy5YYSgiZW1wdHkiKTticmVhaztjYXNlIHcuSWYuY29kZTplLnYoay5pdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LkxmLmNvZGU6ZS52KGsuT3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuWWQuY29kZTplLnYoay5Qdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6ZS52KGsuVnMsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLmV3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5FZi5jb2RlOmUudihrLmZ3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLlhiKGEpO3RoaXMuUmEoKX0sWGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5LZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sUHU6ZnVuY3Rpb24oYSl7dGhpcy5wZT0hMTt0aGlzLlBiPQp0aGlzLmIuSzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5QYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuJGU9ITB9Y2F0Y2goZil7fX1jYXRjaChlKXt9Yi5keT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsCnRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTt0aGlzLnBvJiZ0aGlzLnBsYXllci52ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuTy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5PW2NdLnR5cGUpJiZ0aGlzLmtvKGIsYS5PW2NdLnVybCsiIixhLk9bY10udHlwZSk7dGhpcy4kZSYmYi5sb2FkKCk7aWYodGhpcy5YaChiKSl7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5ubyhiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7CnRyeXt0aGlzLiRlP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2goayl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5LcCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuTnUoKSk6dGhpcy5jLm9yaWdpbi51Zyh3LlVkKX0sTnU6ZnVuY3Rpb24oKXt0aGlzLkNmPSEwO3RoaXMuc2I9dGhpcy5uYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLm1nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5zYj0hMCk7ZS5vZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmCmUub28odGhpcy5jLm9yaWdpbi52YSk7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9RS5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi53aCgpO3RoaXMuYi5rZigpO2ZvcihhPXRoaXMuYi5LO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIua2YoKTt0aGlzLnRhPXRoaXMuUGI9dGhpcy5iLks7dGhpcy5oaSgidnBhaWQiKTtpZih0aGlzLnNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuS2IoIm11dGVkIiwiY29udGVudCIpO2UudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5LLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmtyKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmRnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5oZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJiF0aGlzLklkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay56YywKdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuYWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuc2M9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy55dyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnp3KCksdGhpcy5iLmFjKCEwKSwhdGhpcy5PYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy5ILApjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuR2UodGhpcy5PYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmFjKCEwKSx0aGlzLkR3KCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5IdygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5GdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkl3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkV3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm1pKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5WYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkwuYmR8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5RYyYmKHRoaXMuRGY9ITEsdGhpcy5mYygpKSx0aGlzLkJ3KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuc2I9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay52ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5zYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmhlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLmFnKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5ILCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sQXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLm5jPSEwfSxCdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlhjLHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubmM9ITF9LER3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sQ3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5RaCgpO2UudihrLlRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLlhjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubWQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlFmLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxHdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5WZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxJdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbWk6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7CmUub2UoKTt0aGlzLkg9ITE7dGhpcy5SYShhKX19LHl3OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5Kdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubWkoITApfSxrbzpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuR2MoKSl7dmFyIGQ9Yi56YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuc3cuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmMoYix0aGlzLkwpKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LG5vOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmlpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmppLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmppLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0saWk6ZnVuY3Rpb24oYSl7dGhpcy5XYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldifHx0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuWG8pKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWQmJnRoaXMuWGgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5XYil7dGhpcy5hZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5aYSgpLCEwKSx0aGlzLkwudGd8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLnB3KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIua2YoKTt0aGlzLm93KCk7dGhpcy5oaSgpO3RoaXMuZWcoKTt0aGlzLmIud2goKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMubmYoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nZHx8dGhpcy5SZigpfSxSZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmdkfHwoYT90aGlzLlJhKCk6KHRoaXMuUWUoITApLHRoaXMuUmYoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmVjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkxoKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuTC5rYiYmIXRoaXMuRmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5jbyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuUmEoKX0saG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9ITEsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9ZS5IZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQSgpKTtlLmJ2KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJgp0aGlzLmMuU2QmJnRoaXMuaG8odGhpcy5jLlNkKTtpZighdGhpcy5wZSlpZih0aGlzLnBlPSEwLHRoaXMuUmR8fChlLnYoay5Ycyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy50Ynx8dGhpcy5jLnFjKXtlLnBiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm1mKys7dGhpcy5XYj10aGlzLmFkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5HZD0hMTt0cnl7dGhpcy5iLmVpKCl9Y2F0Y2goZyl7fXRoaXMuSWQ9ITA7dGhpcy5iLkJlKCk7dGhpcy5iYz0hMTt0aGlzLnhlKCkuR2goKTt0aGlzLmMudGImJnRoaXMuYy5vcmlnaW4uUmUoKTt0aGlzLmMucWMmJihhP3RoaXMuYy5vcmlnaW4ucWgoKToKdGhpcy5xZSgpKX1lbHNlIHRoaXMucWUoKX0sc3c6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5XYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkwueXAoKTt0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxqaTpmdW5jdGlvbigpe2lmKHRoaXMuS3YpdGhpcy5SYSgpO2Vsc2V7dGhpcy5iYz0hMDt0aGlzLmIuZi5BYSYmIXRoaXMuSWQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dmFyIGE9Ck1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5OdihhKTtpZighdGhpcy5PYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5SZD0hMDtlLnYoay5raSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5sZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PaCkpJiYoYz10aGlzLmMubGYtCmEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy50Yj8odGhpcy5XYj10aGlzLmFkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5HZD0hMSx0aGlzLmIuZWkoKSx0aGlzLmMub3JpZ2luLlJlKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWmMucmVwbGFjZSgiW3RpbWVdIiwKZS5DZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmZlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxiaTpmdW5jdGlvbigpe3RoaXMudmh8fCh0aGlzLnZoPSEwLHRoaXMubWR8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxOdjpmdW5jdGlvbihhKXtlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuY2l8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYmkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5RaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLAp0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5rYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5UZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMubWQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLnYoay5RZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5jaT1hKX0sUGg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsYiwhMCl9LGR2OmZ1bmN0aW9uKCl7ZS5NZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxRaDpmdW5jdGlvbigpe2UuTWQoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0sZXY6ZnVuY3Rpb24oKXtlLk1kKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sClhhOmZ1bmN0aW9uKGEpe2UuTWQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuTC5rYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxLYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5rYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkZiKXt0aGlzLnhkJiZ0aGlzLnhkLnRyYWNrJiZ0aGlzLnhkLnRyYWNrKGEpO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLmlyKHRoaXMuYy5QYSxhKX1jYXRjaChmKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgZz1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmCih0aGlzLmtlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmUuWHIoZy51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZW8sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLktlKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmMuUGE9dGhpcy5VcCh0aGlzLmMuUGEsYSl9Y2F0Y2gobSl7fX19LFphOmZ1bmN0aW9uKCl7dmFyIGE9ZS5WYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixiPSIiO3RoaXMuQ2YmJihiPSJfdnBhaWQiKTt0aGlzLlFjJiYoYj0iX3dlbGVjdCIpO3JldHVybiBhK2J9LEtlOmZ1bmN0aW9uKGEsYixjLGYsZSl7YSYmInN0cmluZyI9PQp0eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxjJiZiLmpvKGMpLGZ8fChmPXRoaXMuc2cpLGV8fChlPXRoaXMuc2cpLHRoaXMubG8oYSksdGhpcy5MLkRhKGIsZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGxvOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09Im9wZW4ifSxGaDpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJjbG9zZWQifSxIcDpmdW5jdGlvbigpe3RoaXMuZGM9e319LGd2OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuZGMpdGhpcy5kYy5oYXNPd25Qcm9wZXJ0eShiKSYmIm9wZW4iPT10aGlzLmRjW2JdJiZhKys7cmV0dXJuIGF9LGlyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sVXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpifSl9LHB3OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5xdy5iaW5kKHRoaXMpKX0scXc6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmZjKCk6dGhpcy5jLlZiJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5MLmJkfHx0aGlzLlFjKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLlZifWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYy5WYixhKX19LmJpbmQodGhpcyksNTAwKSl9LApvdzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlpjLnJlcGxhY2UoIlt0aW1lXSIsZS5DZygwKSk7CnZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5jZCYmKGI9dGhpcy5MLmNkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5jZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sRWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5jZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGhpOmZ1bmN0aW9uKGEpe2lmKCFlLm9mKHRoaXMuY29udHJvbHMpKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpjLmlkPXRoaXMuT3A7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuR2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkViO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Ndi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkx2LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk9oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmMuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmxmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXt0aGlzLkJhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLm1nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGZjOmZ1bmN0aW9uKCl7dGhpcy5CYSYmImJsb2NrIj09dGhpcy5CYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxZaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuWGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxaaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMubmM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLm5jPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLm5jPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5YYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LEx2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxNdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuc2I/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5zYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMuc2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSwkdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmVjKTt0aGlzLmdkfHx0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0scWU6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUua2QoKTshdGhpcy5MLm1jfHxlLlZhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5rZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy50aHx8IXRoaXMuTC5VYyYmInNwaWVnZWwuZGUiIT1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwicHJlcm9sbCIhPWUuQ2I/KHRoaXMuZ2Q9ITAsdGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy5uZygpKToodGhpcy50aD10aGlzLlFjPXRoaXMuRGY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5rZT0hMCxhPWUuZGcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuTGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuZ3YoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy5JZD0hMCx0aGlzLmIuQmUoKSx0aGlzLmIucXUoKSx0aGlzLmJjPSExLAplLnYoay5OcCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMueGUoKS5HaCgpKX0seGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZWc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZS5GZSh0aGlzLnZpZGVvLGEpP3RoaXMuSWgoKTp0aGlzLnlkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVmIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5zYyYmMDx0aGlzLnNjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5zYykpO3RoaXMudmlkZW8mJgp0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMua3ArIi0iK3RoaXMubWY7dGhpcy5jJiZ0aGlzLmMuSWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLklnKCkpO3JldHVybiBhfSxzZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuVGp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRwPXRoaXMuYVsyXTt0aGlzLm50PXRoaXMuYVs4XTt0aGlzLll3PXRoaXMuYVsxXTt0aGlzLm5rPXRoaXMuYVsxMF07dGhpcy5raz10aGlzLmFbNV07dGhpcy5Vbj10aGlzLmFbNV07dGhpcy5Bbj10aGlzLmFbNl07dGhpcy5lbj10aGlzLmFbMV07dGhpcy52cj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLkJpPWI7Yi5wcm90b3R5cGU9CntTcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVHA6dGhpcy5tdChhKX0sbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm50OnRoaXMuWHcoYSl9LFh3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Zdzp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubms6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmtrOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Vbjp0aGlzLnpuKGEpfSx6bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQW46dGhpcy5kbihhKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVuOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuQml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5TcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkdhPW51bGw7dGhpcy5ZPVtdO3RoaXMuVT1udWxsO3RoaXMucmM9dGhpcy50Yz0hMTt0aGlzLnZhPSIiO3RoaXMuQmY9ITE7dGhpcy5UZz0iIjtkJiZkLmVtcHR5P3RoaXMuQXMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5rbj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5rZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPQohMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bS55YShtLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVmEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlKXthPWUucGcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uSmQoYSkpKyImdHlwZT1qcyIsYj1tLnlhKG0uSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0ueWEobS5KZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnpzLmJpbmQodGhpcyksdGhpcy53cy5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkdhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5DYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuQ2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkNifHx0aGlzLmJzKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLm52KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGJzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0senM6ZnVuY3Rpb24oYSl7dGhpcy5adChhKTt0cnl7dGhpcy5HYT1hLnJlc3BvbnNlWE1MLHRoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOgpHLkpmfSkpfSxBczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWWQpKX10aGlzLlk9dGhpcy5FZygpO3RoaXMudGM9dGhpcy5yZigpO3RoaXMucmM9dGhpcy5VaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5KYygpOnRoaXMuc2EodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkJmP0cuWGQ6Ry5KZn0pKX0sd3M6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5JZix7ZGVwdGg6YX0pKX0sSmM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5kcygpP3RoaXMueXYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMuUnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMuY3coKSYmdGhpcy5XZSh0aGlzLlJwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPwoodGhpcy50Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5SZSgpfSxxaDpmdW5jdGlvbigpe3RoaXMucmM/KHRoaXMucmM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSmMoKSk6dGhpcy5wYXJlbnQucWgoKX0sY3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52digpP3RoaXMudXYoKT8hMDooLTEhPXRoaXMuRGMoKT90aGlzLnNhKHRoaXMuU2Eody5UZCkpOnRoaXMuc2EodGhpcy5TYSh3LkVmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5TYyxHLktmKSksITEpfSxXZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5TZHx8KGEuU2Q9W10pO2EuU2QucHVzaCh0aGlzLlRnKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuQWc7dGhpcy5wYXJlbnQuV2UoYSl9LFJwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuRGMoKTthLk89dGhpcy5LZygpO2EuVmI9dGhpcy5UcSgpO2Eubnc9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5RcSgpO2EubGY9dGhpcy5ncihhLmR1cmF0aW9uKTthLmFiPWEuYWI/YS5hYjotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuQWc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLmFiPWIuYWI/Yi5hYjotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuQWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlVxKCkpOmIuUGEuY29uY2F0KHRoaXMuYnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5YYiYmdGhpcy5wYXJlbnQuWGIoYiksYT0wLHRoaXMuSmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxYYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5YYihhKX0sdWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30seXY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSx2djpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuS2coKS5sZW5ndGh9LHV2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSxVaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxadDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuQmY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sZHM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk5nKCkubGVuZ3RofSxOZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LFJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5sYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuYWgoYS5wYXJlbnROb2RlKTohMX0sYnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sVXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFRxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxGeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5wZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxncjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLmF2KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5wZChhKToiIn0scGQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLmtufHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp2PXRoaXMuYVs1XTt0aGlzLm5tPXRoaXMuYVsxXTt0aGlzLmlsPXRoaXMuYVs4XTt0aGlzLnhsPXRoaXMuYVs3XTt0aGlzLlJ3PXRoaXMuYVsxMF07dGhpcy5ObD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLlBxPWI7Yi5wcm90b3R5cGU9e0l2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kdjp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlsOnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54bDoKdGhpcy5RdyhhKX0sUXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJ3OnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlBxfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Jdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5mbT1iO2IucHJvdG90eXBlPXtLcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSwkcTpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy4kcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sa3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmZtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5UaT10aGlzLmFbOF07dGhpcy5Paz10aGlzLmFbOV07dGhpcy5lbT0KdGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzZdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuZ2s9dGhpcy5hWzRdO3RoaXMuenQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5adj1iO2IucHJvdG90eXBlPXtTaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVGk6dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk9rOnRoaXMuZG0oYSl9LGRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbTp0aGlzLkN2KGEpfSxDdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHY6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nazp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlp2fHxXYSxIYz1uZXcgV2EoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuU2koNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApneDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGh4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlB2PXRoaXMuYVs4XTt0aGlzLlZtPXRoaXMuYVs3XTt0aGlzLkRvPXRoaXMuYVsxMF07dGhpcy5QaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLkV2PWI7Yi5wcm90b3R5cGU9e092OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qdjp0aGlzLlVtKGEpfSxVbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm06dGhpcy5DbyhhKX0sQ286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkRvOnRoaXMuT2koYSl9LE9pOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuRXZ8fFhhLEljPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk92KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj0KYTt0aGlzLmpkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuRmo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkZqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KaT10aGlzLmFbMV07dGhpcy5VdD10aGlzLmFbN107dGhpcy53aT10aGlzLmFbMV07dGhpcy5jbT10aGlzLmFbNl07dGhpcy5VdT10aGlzLmFbNl07dGhpcy5HbD10aGlzLmFbMTBdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuUHI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy54bT1iO2IucHJvdG90eXBlPXtJaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSmk6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdDp0aGlzLnZpKGEpfSx2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5ibShhKX0sYm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5jbTp0aGlzLlR1KGEpfSxUdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXU6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdsOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50azp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUHI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLnhtfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5JaSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSGg9YTt0aGlzLnZpZGVvPWI7dGhpcy5QZD1bXTt0aGlzLkVoPVtdO3RoaXMuU2U9W107dGhpcy5ydz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLmpsPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLiR4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm51LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmZ1LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwpsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuUGQucHVzaCh7c3JjOmMsZnJhbWU6ZyxCdDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5TZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlNlW2JdO2MudHlwZT09PWEmJmMudXAodGhpcy5WcShhKSl9fSxWcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpeTohMCxoeTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntXeDoidmlkZW8iLGt5OiJqc0N1c3RvbSIsbHk6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbXk6MSxHeDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LGpyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5QZC5sZW5ndGg7YisrKWlmKHRoaXMuUGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5QZFtiXS5CdDtyZXR1cm4iIn0sbnU6ZnVuY3Rpb24oYSxiKXt0aGlzLkVoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLmpyKGIpLHZlbmRvcjpifSk7CnRoaXMuY3YoKX0sZnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnJ3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSx1cDpiLGZ5OiExfSl9LGN2OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS4kcnx8KGEuWngoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmp5LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS4kcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5qbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmo9dGhpcy5hWzEwXTt0aGlzLm5sPXRoaXMuYVsxXTt0aGlzLlNrPQp0aGlzLmFbNV07dGhpcy5Ecz10aGlzLmFbNV07dGhpcy5ncT10aGlzLmFbMl07dGhpcy52bD10aGlzLmFbM107dGhpcy5zbT10aGlzLmFbMl07dGhpcy5DbT10aGlzLmFbM107dGhpcy5Tbj10aGlzLmFbNF07dGhpcy5Raz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLkdzPWI7Yi5wcm90b3R5cGU9e2FqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5iajp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmw6dGhpcy5SayhhKX0sUms6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNrOnRoaXMuQ3MoYSl9LENzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy51bChhKX0sdWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52bDp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNtOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuQ206dGhpcy5SbihhKX0sUm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNuOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Razp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuR3N8fFphLEtjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLmFqKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMuZj1hO3RoaXMuamI9YS5GZygpO3RoaXMuSz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLksuaWQ9ZS5hYSgxMCk7dGhpcy5GPUUucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5jZz0hMTt0aGlzLlRiPVtdfWMub2o9YjtiLnByb3RvdHlwZT17T3E6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5PcShhKTtmb3IodmFyIGI9MCxjPTAsZT0hMSxnPXRoaXMud3IoYSksaz17fTthOyliKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGp2OmZ1bmN0aW9uKCl7dGhpcy5jZz0hMH0sZWk6ZnVuY3Rpb24oKXt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LAp3aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLnpjLHRoaXMuZi5zKCkpfSxxdTpmdW5jdGlvbigpe3RoaXMuY2d8fCh0aGlzLmYucGxheSgpLGUudihrLmZkLHRoaXMuZi5zKCkpKX0sa2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuSy5zdHlsZS56SW5kZXg9YTt0aGlzLksuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5LLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLksuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLksuc3R5bGUuYm94U2l6aW5nPXRoaXMuamIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSy5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PXRoaXMuamIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5qYik7dGhpcy5mLk1jJiZ0aGlzLmYuTWMoKT90aGlzLmYuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5LKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSx3cjpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGImJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sSXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249CmIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sYWM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JcSh0aGlzLmpiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkJlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5NYygpPyh0aGlzLksuc3R5bGUubGVmdD0iMHB4Iix0aGlzLksuc3R5bGUudG9wPSIwcHgiKToodGhpcy5LLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5LLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5LLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KwoicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLm9mKHRoaXMuSykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGFnOmZ1bmN0aW9uKGEpe3RoaXMuVGJ8fCh0aGlzLlRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5UYi5wdXNoKGEpfSxCZTpmdW5jdGlvbigpe3RoaXMuSyYmdGhpcy5LLnBhcmVudE5vZGUmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkspO3RoaXMuRiYmdGhpcy5GLnBhdXNlJiZ0aGlzLkYucGF1c2UoKX19fSkoYyk7Zm9yKHZhciAkYT1jLm9qfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtFLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FbD10aGlzLmFbN107dGhpcy54cT10aGlzLmFbMV07dGhpcy55bz10aGlzLmFbMV07dGhpcy5MbD10aGlzLmFbNF07dGhpcy5ycT10aGlzLmFbM107dGhpcy5Odz10aGlzLmFbMl07dGhpcy5Hbz10aGlzLmFbMV07dGhpcy5haz10aGlzLmFbNF07dGhpcy51bj10aGlzLmFbNl07dGhpcy5qPQp0aGlzLmFbMl19Yy5ocD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWw6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhxOnRoaXMueG8oYSl9LHhvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55bzp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGw6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJxOnRoaXMuTXcoYSl9LE13OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Odzp0aGlzLkZvKGEpfSxGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR286dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFrOnRoaXMudG4oYSl9LHRuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJiPWMuaHB8fGJiLExjPQpuZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5EbCg0KTsoZnVuY3Rpb24oYyl7Yy5TbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5XKGEpO3RoaXMuRGQoYik7dGhpcy5xZygpfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0scWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkthKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLAphP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sRWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5LYSgpOwppZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLlNsfHxjYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuVWY9dGhpcy5XZj10aGlzLlhnPXRoaXMuZWE9dGhpcy51Zj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkVxKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51Zj0hMDt0aGlzLlhnJiZ0aGlzLmtnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsCiJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJmEuYmMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuWGc9ITA7dGhpcy5rZygpfS5iaW5kKHRoaXMpKTt0aGlzLmdnKCl9LGtnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Ipe3RoaXMuZGQoKTtpZighdGhpcy51ZiYmIXRoaXMuZGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnVmJiZ0aGlzLlVmJiYhdGhpcy5XZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGRkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpOwpyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sTGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sZ2c6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPXRoaXMuTGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5XZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlVmPWIuRHh9dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSxIeDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5VeCgpOiExfSxEYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkRjKCk6LTF9LGNyOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LEVxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlNifHwzMDI9PXRoaXMuU2I/dGhpcy5lYT0hMDp0aGlzLnUoImFkZXJyb3IiLHRoaXMuU2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOmIuRWUoKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5jcihiKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksCjJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy5SbHx8ZGI7KGZ1bmN0aW9uKGMpe2MuVGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxhczpmdW5jdGlvbigpe3dpbmRvdy5PTy5sbS5Ybi5Wbj93aW5kb3cuT08ubG0uWG4uVm4uQngoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYXMoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS55ZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgY2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IGRiKGMsCnRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy5UbHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ0PXRoaXMuYVs1XTt0aGlzLnZ3PXRoaXMuYVs4XTt0aGlzLllwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzhdfWMuYXE9YjtiLnByb3RvdHlwZT17YXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJ0OnRoaXMudXcoYSl9LHV3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52dzp0aGlzLlhwKGEpfSxYcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWXA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLmFxfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuYXQoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLnpoKCl9LHpoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ZaXx8aGI7KGZ1bmN0aW9uKGMpe2MuWGk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0saGc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucmEoKTp0aGlzLm0oKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuaGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sQ2g6ZnVuY3Rpb24oYil7Yj1uZXcgaGIoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fChiLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlIoYiksKG5ldyBpYihiLHRoaXMuSSkpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZxfHwodGhpcy5GcT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuQ2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkNoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7CnRoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuWml8fGpiLFQ9bmV3IGpiKHIpO1QuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZ3PXRoaXMuYVsxXTt0aGlzLlFsPXRoaXMuYVsxXTt0aGlzLnFzPXRoaXMuYVs2XTt0aGlzLkF2PXRoaXMuYVsxMF07dGhpcy5paz10aGlzLmFbMV07dGhpcy5ycD10aGlzLmFbOV07dGhpcy5idT10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLkFpPWI7Yi5wcm90b3R5cGU9e1V3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Wdzp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFsOnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xczp0aGlzLnp2KGEpfSx6djpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQXY6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5pazp0aGlzLnFwKGEpfSxxcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJwOnRoaXMuYXUoYSl9LGF1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5idTp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkFpfHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5Vdyg0KTsoZnVuY3Rpb24oYyl7Yy5ObT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuTm18fFU7KGZ1bmN0aW9uKGMpe2MuTW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guWWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlljKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuJHMoYSl9LmJpbmQodGhpcykpO3guWWMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5ZYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3gucXIoKX0sJHM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwKMzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLk1tfHxWOyhmdW5jdGlvbihjKXtjLk9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTsKdGhpcy53ZCYmKGI9ZS5WcChiLHRoaXMud2QpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLndkfHwodGhpcy53ZD1bXSksdGhpcy53ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWWM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8Cih0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LEJ2OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5wdSgpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxxcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9CmEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5CdihiKX19KX0pKGMpO3ZhciBsYj1jLk9tfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpuPXRoaXMuYVsxXTt0aGlzLldrPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMudHc9YjtiLnByb3RvdHlwZT17aG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuVmsoYSl9LFZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuV2s6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYj1jLnR3fHxtYixPYz1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy5obig0KTsoZnVuY3Rpb24oYyl7Yy5VaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxBYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuVWl8fG5iOyhmdW5jdGlvbihjKXtjLlZpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMudSgibm9BZCIsInBsYXllZCIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLlZpfHxvYjsoZnVuY3Rpb24oYyl7Yy5XaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpOwppZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBuYihkKTt0aGlzLk4oZyl8fCh0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLldpfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1wPXRoaXMuYVs1XTt0aGlzLmVxPXRoaXMuYVs3XTt0aGlzLkp0PXRoaXMuYVs0XTt0aGlzLlVrPXRoaXMuYVs2XTt0aGlzLmduPXRoaXMuYVs4XTt0aGlzLndtPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuUXU9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1wOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lcTp0aGlzLkl0KGEpfSxJdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSnQ6dGhpcy5UayhhKX0sVGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVrOnRoaXMuZm4oYSl9LGZuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbjp0aGlzLnZtKGEpfSx2bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj0KYy5RdXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMubHAoNCk7KGZ1bmN0aW9uKGMpe2MuSWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuZXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZXU6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJgphLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFlnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuSWx8fHNiOyhmdW5jdGlvbihjKXtjLkhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLkhsfHx0YjsoZnVuY3Rpb24oYyl7Yy5KbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9CmwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5KbHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZmo9dGhpcy5hWzddO3RoaXMuUHM9dGhpcy5hWzNdO3RoaXMuc3U9dGhpcy5hWzZdO3RoaXMuZng9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy5Hcj1iO2IucHJvdG90eXBlPXtlajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmo6dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBzOgp0aGlzLnJ1KGEpfSxydTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnN1OnRoaXMuZXgoYSl9LGV4OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5meDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuR3J8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmVqKDQpOyhmdW5jdGlvbihjKXtjLnFuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMucW58fAp3YjsoZnVuY3Rpb24oYyl7Yy5wbj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxZYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sY3U6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5jdSh0aGlzLkNhKToodGhpcy5DYT10aGlzLlliKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpO3JldHVybn1pZighdGhpcy51Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZiLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmZiW2FdJiYzMDMhPXRoaXMuZmJbYV0mJjQwMyE9dGhpcy5mYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKNTAwKX19KX0pKGMpO3ZhciB4Yj1jLnBufHx4YjsoZnVuY3Rpb24oYyl7Yy5ybj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMucm58fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MbT10aGlzLmFbMV07dGhpcy5HcD10aGlzLmFbMV07dGhpcy5SbT10aGlzLmFbOV07dGhpcy5Rbj10aGlzLmFbOV07CnRoaXMua3E9dGhpcy5hWzEwXTt0aGlzLnp1PXRoaXMuYVs2XTt0aGlzLnVvPXRoaXMuYVsyXTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzJdfWMuY249YjtiLnByb3RvdHlwZT17S206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxtOnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HcDp0aGlzLlFtKGEpfSxRbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUm06dGhpcy5QbihhKX0sUG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlFuOnRoaXMuanEoYSl9LGpxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcTp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuenU6dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVvOnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT8KdGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLmNufHxBYixSYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5LbSg0KTsoZnVuY3Rpb24oYyl7Yy56bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5YZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuTHQoKX0uYmluZCh0aGlzKSw1MDApfSxMdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJgphJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5YZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5YZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxmdjpmdW5jdGlvbigpe3RoaXMuWGU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBCYj1jLnptfHxCYjsoZnVuY3Rpb24oYyl7Yy55bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubGM9MH0sZzpmdW5jdGlvbigpe3RoaXMuRnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmxjfHwodGhpcy5sYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5sY3x8dGhpcy5sYysrLHRoaXMubGM8PXRoaXMuRnM/KHRoaXMubGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLmZ2KCksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBDYj1jLnltfHxDYjsoZnVuY3Rpb24oYyl7Yy5BbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgQ2IoYix0aGlzLkkpKS5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBEYj1jLkFtfHxEYixFYj1uZXcgRGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnE9dGhpcy5hWzZdO3RoaXMubHQ9dGhpcy5hWzNdO3RoaXMuSGk9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy50dD1iO2IucHJvdG90eXBlPXt1cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnE6dGhpcy5rdChhKX0sa3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmx0OnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLnR0fHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1TYy51cSg0KTsoZnVuY3Rpb24oYyl7Yy5wbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLnBtfHxHYjsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzsKYSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLkxwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMub2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnNzKCk6dGhpcy5qZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LExwOmZ1bmN0aW9uKCl7dGhpcy5TZigpfHx0aGlzLm0oITApfSxzczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm9kKCk7IWIucWEmJmIuWSYmYi5BeCYmYi5DeCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoKX0uYmluZCh0aGlzKSwxMDApfSxvZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVoKWZvcih2YXIgYj1sLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLmlkLApjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudWg9YltjXSk7cmV0dXJuIHRoaXMudWh9LFZ4OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLm9kKCkuYWRzTG9hZGVyP3RoaXMuRyghMCk6dGhpcy5HKCk6dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEhiPWMub218fEhiOyhmdW5jdGlvbihjKXtjLnFtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwucGxheWVyYXBpKXt2YXIgYj1sLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgSGIoYyx0aGlzLkkpKS5nKCkpfXJldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgSWI9Yy5xbXx8SWIsSmI9bmV3IEliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNqPXRoaXMuYVszXTt0aGlzLnduPXRoaXMuYVs0XTt0aGlzLlNqPXRoaXMuYVs1XTt0aGlzLktxPXRoaXMuYVs2XTt0aGlzLkRpPXRoaXMuYVs4XTt0aGlzLnNvPXRoaXMuYVs3XTt0aGlzLldvPXRoaXMuYVs2XTt0aGlzLnppPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzZdfWMucnM9YjtiLnByb3RvdHlwZT17Qmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNqOnRoaXMudm4oYSl9LHZuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud246dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNqOgp0aGlzLkpxKGEpfSxKcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS3E6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRpOnRoaXMucm8oYSl9LHJvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zbzp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV286dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56aTp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnJzfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5Caig0KTsoZnVuY3Rpb24oYyl7Yy5mbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxUeDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxNYzpmdW5jdGlvbigpe3JldHVybiEwfSxLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9CmMuZmx8fFg7KGZ1bmN0aW9uKGMpe2MuZGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlllJiZiIT10aGlzLlllfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLmF5KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuZGx8fFk7KGZ1bmN0aW9uKGMpe2MuZ2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5uYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuZ2x8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY2s9dGhpcy5hWzEwXTt0aGlzLiRwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuRW89YjtiLnByb3RvdHlwZT17Yms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmNrOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuRW98fE5iLFVjPW5ldyBOYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5iayg0KTsoZnVuY3Rpb24oYyl7Yy5Qaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LEF1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LApBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5Qanx8T2I7KGZ1bmN0aW9uKGMpe2MuT2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5Panx8UGI7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpOwp2YXIgUWI9Yy5Ranx8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs2XTt0aGlzLkZtPXRoaXMuYVsyXTt0aGlzLmNsPXRoaXMuYVsxXTt0aGlzLlN1PXRoaXMuYVs2XTt0aGlzLld0PXRoaXMuYVs0XTt0aGlzLldsPXRoaXMuYVs3XTt0aGlzLnZ0PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzZdfWMuRnQ9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRsOnRoaXMuRW0oYSl9LEVtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GbTp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5SdShhKX0sUnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlN1OnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV3Q6dGhpcy5WbChhKX0sClZsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbDp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLkZ0fHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Fbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSwKTmQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LGR1OmZ1bmN0aW9uKCl7dGhpcy5SYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJjfHwodGhpcy5SYz0hMCx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5OZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxBYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuRW58fFRiOyhmdW5jdGlvbihjKXtjLkRuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LERoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSwKYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VYihhKX0uYmluZCh0aGlzKSkpLGImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5EaC5iaW5kKHRoaXMpLDEwKX0sVWI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT0KYS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxPZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5VYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuT2YoKTt0aGlzLmd1KCl9LGd1OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGIpe3RoaXMuVWIoYil9KX0sbTpmdW5jdGlvbihiKXt0aGlzLiR0P3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihiKXt0aGlzLiR0PSEwO2lmKGImJmIuZGV0YWlsKWZvcih2YXIgYSBpbiBiLmRldGFpbCkiYWRUYWdVcmwiPT1hJiYoYi5kZXRhaWxbYV18fHRoaXMuVWIoYikpfX0pfSkoYyk7dmFyIFViPWMuRG58fFViOyhmdW5jdGlvbihjKXtjLkZuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIuZHUoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpOwp2YXIgVmI9Yy5Gbnx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLlluPWI7Yi5wcm90b3R5cGU9e2pzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLllufHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy5qcyg0KTsoZnVuY3Rpb24oYyl7Yy5abT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLnhoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT0KYi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLk5zPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxBdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTnN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy54aCYmCih0aGlzLnhoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy5abXx8TzsoZnVuY3Rpb24oYyl7Yy5ZbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuTXUoKTp0aGlzLm0oITApLCEwO3RoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubSgpOnRoaXMubSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnVlPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlM9CnRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLlltfHxQOyhmdW5jdGlvbihjKXtjLiRtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwKKHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuY2YoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLiRtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMucms9dGhpcy5hWzZdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy5Xdj1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSHQ6CnRoaXMucWsoYSl9LHFrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5yazp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Xdnx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuR3QoNCk7KGZ1bmN0aW9uKGMpe2MuSms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ka3x8WjsoZnVuY3Rpb24oYyl7Yy5Jaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5yYigpLCEwO3RoaXMuVWcrKztpZigxMDx0aGlzLlVnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0KITB9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLklrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Laz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLktrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY3A9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzldO3RoaXMuTm49dGhpcy5hWzZdO3RoaXMuS3I9dGhpcy5hWzVdO3RoaXMuSG49dGhpcy5hWzRdO3RoaXMucHE9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5saz1iO2IucHJvdG90eXBlPXticDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY3A6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5lazp0aGlzLk1uKGEpfSxNbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTm46dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktyOnRoaXMuR24oYSl9LEduOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Ibjp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLmxrfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5icCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJgphPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Nanx8ZGM7KGZ1bmN0aW9uKGMpe2MuTGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaWcoKX0saWc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLkxqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Oaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLk5qfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHQ9dGhpcy5hWzldO3RoaXMucmo9dGhpcy5hWzZdO3RoaXMuQnI9dGhpcy5hWzNdO3RoaXMuS3M9dGhpcy5hWzNdO3RoaXMuV3U9dGhpcy5hWzEwXTt0aGlzLkpuPXRoaXMuYVs1XTt0aGlzLnB0PXRoaXMuYVs2XTsKdGhpcy5qPXRoaXMuYVsxMF19Yy5zdD1iO2IucHJvdG90eXBlPXtjdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZHQ6dGhpcy5xaihhKX0scWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnJqOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ccjp0aGlzLkpzKGEpfSxKczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3M6dGhpcy5WdShhKX0sVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLld1OnRoaXMuSW4oYSl9LEluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kbjp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucHQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLnN0fHxoYyxaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9WmMuY3QoNCk7KGZ1bmN0aW9uKGMpe2Mucmk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMucml8fGljOyhmdW5jdGlvbihjKXtjLnBpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGZnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5mZy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnBpfHxqYzsoZnVuY3Rpb24oYyl7Yy5zaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9Cm5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnNpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQW89dGhpcy5hWzJdO3RoaXMuRWo9dGhpcy5hWzRdO3RoaXMuQ2w9dGhpcy5hWzhdO3RoaXMuVG09dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzddO3RoaXMuaj0KdGhpcy5hWzNdfWMuUXM9YjtiLnByb3RvdHlwZT17em86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkFvOnRoaXMuRGooYSl9LERqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fajp0aGlzLkJsKGEpfSxCbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2w6dGhpcy5TbShhKX0sU206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRtOnRoaXMuSm8oYSl9LEpvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMuUXN8fG1jLCRjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLnpvKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdOwp0aGlzLmJmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj8KbnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcWI/bnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLmhtPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuZHIoYSk6W10sYjt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107CnRoaXMueGYoYikmJih0aGlzLnpkLnB1c2goYiksdGhpcy5KaChiKSl9fSx4ZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmJmW2NdLHRoaXMueGYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5nKCl9LGh2OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG5jPWMuaG18fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5RcD10aGlzLmFbMV07dGhpcy5Gaz10aGlzLmFbN107dGhpcy5NcT10aGlzLmFbMTBdO3RoaXMuTXM9dGhpcy5hWzddO3RoaXMuWXU9dGhpcy5hWzZdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMueWo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5ncD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUXA6dGhpcy5FayhhKX0sRWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZrOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5NcTp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTXM6dGhpcy5YdShhKX0sWHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLll1OnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cjp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5ncHx8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9YWQuUHAoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQ2Moay5kdyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywKITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkNjKGsuV3MpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgYmQ9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLlpnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWmcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTsKSS5rYSgpO3ZhciBjZD1iZChmdW5jdGlvbigpe2Uuemcod2luZG93LEkuUXIoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhxPXRoaXMuYVs3XTt0aGlzLll2PXRoaXMuYVs0XTt0aGlzLmJvPXRoaXMuYVszXTt0aGlzLm5yPXRoaXMuYVs3XTt0aGlzLmpqPXRoaXMuYVs0XTt0aGlzLlFvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMuQm89YjtiLnByb3RvdHlwZT17R3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYm86dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5yOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuamo6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5Cb3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuR3EoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnloPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy51ZD0wO3RoaXMuZWI9IiI7dGhpcy5BZD1bXTt0aGlzLkJkPTA7dGhpcy5BaD0hMTt0aGlzLlplPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnRpPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3RoaXMueWg9YX0saGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKRHU6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSxOYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5iYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLlRyKCkpdGhpcy5uYi5sKHRoaXMubmIucWQsCnRoaXMubmIud2EsdGhpcy5uYi5hZixmdW5jdGlvbigpe3RoaXMuTmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLkJjKTtlbHNlIGlmKHRoaXMuc3IoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmp2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm5iLGcpO2wuQnUodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkVzKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJgooYz10aGlzLnBsYXllci5KZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5MZShhLGMsZik7dGhpcy5wbGF5ZXIuTGgobCl9fSxUcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnVkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yj8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LCR1OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UuZ2YoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX0sWnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueWgpe2UuZ2YoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLkl1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnZnKGMpKT90aGlzLk5jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LGp1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuT3UodGhpcy5adS5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuTmEoKX0sRmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZ2YoIm1pZHJvbGwiKTtpZighdGhpcy5uaCl7dGhpcy5uaD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5OYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX19LGl1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHUodGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy4kdSgpO3RoaXMucGxheWVyLk9lJiZ0aGlzLml1KCk7dGhpcy5qdSgpfSxrdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5BZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuV3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxzcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSx2dTpmdW5jdGlvbihhKXt0aGlzLkFoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuUHQuYmluZCh0aGlzKSl9LFB0OmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLlplLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy5BaCgpfSxFczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5aZS5sZW5ndGg7YysrKWI9CnRoaXMuWmVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubXY9dGhpcy5hWzRdO3RoaXMuS2o9dGhpcy5hWzNdO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnRxPXRoaXMuYVs1XTt0aGlzLlR3PXRoaXMuYVszXTt0aGlzLmZ0PXRoaXMuYVs4XTt0aGlzLlR2PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzldfWMuUG09YjtiLnByb3RvdHlwZT17bHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm12OnRoaXMuSmooYSl9LEpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2o6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMuc3EoYSl9LHNxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6CnRoaXMuU3coYSl9LFN3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udzp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZnQ6dGhpcy5TdihhKX0sU3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Udjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuUG18fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLmx2KDQpfSkuY2FsbChhdUZlZXNodWVlWWFpeW9vLGF1RmVlc2h1ZWVZYWl5b28pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.224.196.127
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-13-224-196-127.fra2.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.giga.de/71bfebcef331da73881ff8191dc6784bead9ee1c/
Frame E2F6
|
653 B
1 KB
|
137ms
66ms
|
XHR
application/json |
5.9.139.135
HETZNER-AS
|
|
General
- Full URL
- https://ssl.2.damoh.giga.de/71bfebcef331da73881ff8191dc6784bead9ee1c/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGF1RmVlc2h1ZWVZYWl5b289YXVGZWVzaHVlZVlhaXlvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5wcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5EdShtKTthLkN1KGwpO2Eua3UoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5MdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXQ9dGhpcy5hWzVdO3RoaXMuTG49dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLnFvPWI7Yi5wcm90b3R5cGU9e1h0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZdDp0aGlzLktuKGEpfSxLbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTG46dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndvOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5GaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMucW98fGhhLHNjPQpuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5YdCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5wcD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuT3QuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5Waj1iO2IucHJvdG90eXBlPXtpdjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTsKdGhpcy5vYlthXSs9MTs1PHRoaXMub2JbYV0mJiF0aGlzLlNnW2FdJiYodGhpcy5TZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLml2KCksITApKX0sb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sb286ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSwKe3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxPdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5OdChhLmRhdGEpfSxOdDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9CkpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sSGc6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbW86ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLk5xKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PQpiLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LE5xOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxjczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9CmFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sb2Y6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOgohMTohMX0sRmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3E9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmUoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYKMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09CnR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eT1rO3U9bTtyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHEsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChxLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7Cm09bSt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihtKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxxPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sWnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxrZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17UWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sJGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCnhyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LHNuOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxhbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LEhtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sWW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5RaSgpfHxhLiRpKCl8fGEueHIoKXx8YS5VbCgpfHxhLnNuKCl8fGEuYWwoKXx8YS5IbSgpfX07cmV0dXJuIG51bGwhPWEuWW8oKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpOwp2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxmcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sVnA6ZnVuY3Rpb24oYSwKYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LGF2OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj0KYX0semc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5DYjt0aGlzLmVlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sUXQ6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJgoxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5mcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGJ2OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9CnRoaXMuWmIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmVlKGEpfSxlZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlF0KGEpO2lmKGIpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKGIpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTWQ6ZnVuY3Rpb24oYSl7aWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLnpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuY3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8CnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMueGcoYSkpcmV0dXJuIHRoaXMueGcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSwKZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnNkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLm1vKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIGw9ZXx8bTtlPSEwO2smJihlPSExKTtpZihsJiZsLlYpaWYobC5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLApjLGwsZyxrKX0uYmluZCh0aGlzKSw1MDApfSxraDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5czpmdW5jdGlvbihhLApiLGQpe3RoaXMua2goYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuT2MpZm9yKHZhciBjIGluIHRoaXMuT2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5PY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5iYihhLGYuTGEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnlzKGYuc2QoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEx1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LFd3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIiwKZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxhcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sWHI6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0KMDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLlZqfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlVqPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuQ3Q9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuS3c9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi55cT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLllmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlFmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuY289e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07CmIuaXc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlVzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnpxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Pdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLk5wPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5mZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTsKYi56Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuWGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLmZvPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5YYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLmVvPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTsKYi5Ycz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnZkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuSnc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZXc9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmZ3PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Xcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5Vanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs2XX1jLnBqPWI7Yi5wcm90b3R5cGU9e0Z2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIGphPWMucGp8fGphLHZjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Gdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLldqPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxsYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sYXI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrCm5hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG5kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5uZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm5kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sa2E6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLmxhKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm5kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxRcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuYXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5uZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9Yy5Xanx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50cD10aGlzLmFbNV07dGhpcy5rbT10aGlzLmFbOF07dGhpcy4kbz10aGlzLmFbN107dGhpcy5OaT10aGlzLmFbOF07dGhpcy4kdz10aGlzLmFbMV07dGhpcy5sdz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs3XX0KYy5ucT1iO2IucHJvdG90eXBlPXtzcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudHA6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmttOnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbzp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmk6dGhpcy5adyhhKX0sWnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR3OnRoaXMua3coYSl9LGt3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMubnF8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLnNwKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CnZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5raj1ifSkoYyk7dmFyIEw9Yy5ranx8Ckw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ249dGhpcy5hWzddO3RoaXMuSGs9dGhpcy5hWzhdO3RoaXMuRXQ9dGhpcy5hWzddO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMub3M9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbN119Yy5SaT1iO2IucHJvdG90eXBlPXtCbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ246dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkhrOnRoaXMuRHQoYSl9LER0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FdDp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubmo6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5SaXx8bGEseGM9bmV3IGxhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLkJuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuZ209TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5NYT17fTt0aGlzLkk9bnVsbDt0aGlzLkxjPTEwMDt0aGlzLkliPTA7dGhpcy5XYT0xNTA7dGhpcy5MYj0wO3RoaXMuRXUoYil9LGc6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhPyh0aGlzLkliKyssdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkxjKSk6MD50aGlzLldhJiYodGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkxjKSl9LHB1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWI+dGhpcy5XYT8hMDohMX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLkliPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKRXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuUCgpLCEwKTt0aGlzLk1hW2IubGEoKV09YjtNJiZNLmhoJiZNLmh2KGIpfSxOeDpmdW5jdGlvbigpe3JldHVybiBlLnllKHRoaXMuTWEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX0sWXI6ZnVuY3Rpb24oYil7Yj1iLkthKCk7Zm9yKHZhciBhIGluIHRoaXMuTWEpaWYoYi5pZD09dGhpcy5NYVthXS5LYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxleTpmdW5jdGlvbihiKXt0aGlzLk1hW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLmdtfHx0OyhmdW5jdGlvbihjKXtjLmltPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9CnRoaXMuaWQ9bnVsbDt0aGlzLkxjPTEwO3RoaXMuSWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubmE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkJiPSIiO3RoaXMucmc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5LYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxNOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30sT3U6ZnVuY3Rpb24oYil7dGhpcy5YPWJ9LE94OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sSHU6ZnVuY3Rpb24oYil7dGhpcy5QZT1ifSxNeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlfSxPZTpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2EmJih0aGlzLkliKyssCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTGMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sRmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sCmxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sZ3k6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMudHIoKXx8dGhpcy5pbygpO3RoaXMuRGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxQeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxpbzpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5hYSgxMCkpfSx0cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sVzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxLYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFZTpmdW5jdGlvbigpe3JldHVybiEwfSwKaXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFh4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmF9LGNhOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMH0sTWM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExoOmZ1bmN0aW9uKGIpe3RoaXMuQmI9Yn0sTHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPQpudWxsfSxSeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuQmImJihiPSEwKTtyZXR1cm4gYn0sYnk6ZnVuY3Rpb24oKXt0aGlzLnJnfHwodGhpcy5yZz0hMCl9LHZlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEl4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLmltfHxwOyhmdW5jdGlvbihjKXtjLnVpPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5JPXRoaXMucGxheWVyPSIiO3RoaXMuTWY9IjEiO3RoaXMuTmY9IjIiO3RoaXMuV249IjMiO3RoaXMuVGM9MDt0aGlzLm9oPTMwO3RoaXMuUmI9W107dGhpcy5oYj1bXTt0aGlzLnBjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLiRmPXRoaXMuZ2k9ITE7dGhpcy5zdGF0dXM9dGhpcy5UYzsKdGhpcy5pZD1lLmFhKDEwKTt0aGlzLmhmKGIpO3RoaXMuRnUoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5naXx8KHRoaXMuZ2k9ITAsZS5NZSgpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmJjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxOcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5rYSgpXXx8KHdpbmRvd1thLmthKCldPXt9KTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldfHwod2luZG93W2Eua2EoKV1bYi5sYSgpXT17fSx3aW5kb3dbYS5rYSgpXVtiLmxhKCldLmluaXRpYXRvcj1lLlpiKCkpO3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT93aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV0rKzp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV09MX0sVnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLAphPSEwLGg9bmV3IEo7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0uaW5pdGlhdG9yIT1lLlpiKCkmJih0aGlzLmpmKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMueGEoKSl7dGhpcy5OcigpO2lmKCF0aGlzLlZyKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmpmKCk7cmV0dXJufXRoaXMuamYoKTt0aGlzLkkodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLiRoKCk7dGhpcy4kZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSx1OmZ1bmN0aW9uKGIsYSl7dGhpcy54YSgpfHwodGhpcy5SYi5wdXNoKGIpLHRoaXMuaGIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5SYiYmMDx0aGlzLlJiLmxlbmd0aCYmKHRoaXMuUmI9CmUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaGIpe2Zvcih2YXIgaD0wO2g8dGhpcy5oYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5oYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5oYltoXS5yZWFzb25dPHRoaXMucGNbYl0mJihhPVtdLGEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksYj10aGlzLmhiW2hdLnJlYXNvbik7dGhpcy5wY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LFF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZ9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxqZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTmZ9LE11OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuV259LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTWZ9LHl4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk5mfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30saGY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxGdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0sWnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxCczpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMudWl8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3A9dGhpcy5hWzZdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuJGs9dGhpcy5hWzZdO3RoaXMuYng9dGhpcy5hWzEwXTt0aGlzLmlxPXRoaXMuYVs2XTsKdGhpcy5kaj10aGlzLmFbOV07dGhpcy5keD10aGlzLmFbOV07dGhpcy5Gcj10aGlzLmFbOF07dGhpcy5mcz10aGlzLmFbM107dGhpcy5Vbz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkdtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3A6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnByOnRoaXMuWmsoYSl9LFprOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy4kazp0aGlzLmF4KGEpfSxheDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYng6dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlxOnRoaXMuY2ooYSl9LGNqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZGo6dGhpcy5jeChhKX0sY3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR4OnRoaXMuRXIoYSl9LEVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gcjp0aGlzLmVzKGEpfSxlczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5mczp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLkdtfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ucCg0KTsoZnVuY3Rpb24oYyl7Yy5Haj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Hanx8b2E7KGZ1bmN0aW9uKGMpe2MuSGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLnp4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPwoodGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuSGp8fHBhOyhmdW5jdGlvbihjKXtjLklqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pOwp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Janx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNxPXRoaXMuYVs5XTt0aGlzLnVzPXRoaXMuYVsxMF07dGhpcy5KbT10aGlzLmFbMTBdO3RoaXMuTXI9dGhpcy5hWzEwXTt0aGlzLmJ3PXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMueWw9YjtiLnByb3RvdHlwZT17QnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNxOnRoaXMudHMoYSl9LHRzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51czp0aGlzLkltKGEpfSxJbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkptOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ncjp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy55bHx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQnEoNCk7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuTXA9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMueWt8fHNhOyhmdW5jdGlvbihjKXtjLnhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UYzt0aGlzLmlzUGxheWluZz10aGlzLlZjPSExO3RoaXMuYmU9MTt0aGlzLldjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlZjPSExO3RoaXMuYmU9MTt0aGlzLldjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5NcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueWQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlZjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5XYy5pbmRleE9mKGEpJiZ0aGlzLldjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuV2MubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LEJzOmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5WY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMueGt8fHRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuV3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5ZcihoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LEt4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFdxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy56a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sdj10aGlzLmFbNV07dGhpcy52aj10aGlzLmFbOV07dGhpcy5TdD10aGlzLmFbNF07dGhpcy5waz10aGlzLmFbMV07dGhpcy51dT10aGlzLmFbMl07dGhpcy5tcz10aGlzLmFbNV07dGhpcy5Caz10aGlzLmFbNF07dGhpcy5tcT10aGlzLmFbMV07dGhpcy51bT10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVszXX1jLndqPWI7Yi5wcm90b3R5cGU9e1F2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Sdjp0aGlzLnVqKGEpfSx1ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmo6dGhpcy5SdChhKX0sUnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlN0OnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wazp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1zOgp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQms6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1xOnRoaXMudG0oYSl9LHRtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMud2p8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlF2KDQpOyhmdW5jdGlvbihjKXtjLm1uPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSwKYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5tbnx8eGE7KGZ1bmN0aW9uKGMpe2MubG49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5GYz10aGlzLkNhPXRoaXMuJGM9ITE7dGhpcy5CaD1lLkhiKDEwKTt0aGlzLmZpPSEwO3RoaXMudWM9dGhpcy5XZz0hMTt0aGlzLlRzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5yaCgpLHRoaXMudnAoKSx0aGlzLnJiKCkpfSxUczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxjeTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkubGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi4kZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkouaWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5pZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkJoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFliOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSmc6ZnVuY3Rpb24oKXtpZighdGhpcy5GYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkZjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5GYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkZjfSxXcjpmdW5jdGlvbigpe2lmKCF0aGlzLlZnKXt2YXIgYj10aGlzLnliKCksYT10aGlzLlVyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5WZz0hMCl9cmV0dXJuIHRoaXMuVmd9LFVyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuJGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLiRjPSEwKTtyZXR1cm4gdGhpcy4kY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlliKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuaHUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksCjIwKX0saHU6ZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3ZhciBiPXRoaXMuSmcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnZjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApfSxKeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmIuYWRzJiYodGhpcy5vZz1iLmFkcyk7cmV0dXJuIHRoaXMub2d9LHZwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2EoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuSmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSw1MCkpfSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuV3IoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5ZYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5ZYigpLHRoaXMudWN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMueWIoKX1lbHNlIHRoaXMuV2c/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCksYj10aGlzLlliKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuV2c9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yaCgpfS5iaW5kKHRoaXMpLAo1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHdwOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud3AoKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5maT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5maSxmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sRHA6ZnVuY3Rpb24oKXt0aGlzLlN4fHwoMTA8dGhpcy53dz8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnd3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMub3UoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRHAoKX0uYmluZCh0aGlzKSwKNTApKSl9LG91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnh3KXt0aGlzLnh3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMubG58fHlhOyhmdW5jdGlvbihjKXtjLm5uPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS55ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpfX0pfSkoYyk7dmFyIHphPWMubm58fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbMTBdO3RoaXMuanA9dGhpcy5hWzRdO3RoaXMuU3I9dGhpcy5hWzZdO3RoaXMuWnM9dGhpcy5hWzVdOwp0aGlzLkFqPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs4XX1jLkx3PWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpwOnRoaXMuUnIoYSl9LFJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Tcjp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnM6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLkx3fHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9QmMuYW4oNCk7KGZ1bmN0aW9uKGMpe2MuWWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxLdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5iYyYmKDA8PWguaW5kZXhPZihkKXx8YS55ZCgpKX0sCnBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKToKd2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuWWx8fENhOyhmdW5jdGlvbihjKXtjLlhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9CjApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5EcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLkRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuS3QoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuWGx8fERhOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLlpsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanQ9dGhpcy5hWzNdO3RoaXMuU3M9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzhdO3RoaXMueHQ9dGhpcy5hWzhdO3RoaXMucmw9dGhpcy5hWzldO3RoaXMubGw9dGhpcy5hWzddO3RoaXMuSW89dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbM119Yy5icT1iO2IucHJvdG90eXBlPXtpdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanQ6dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNzOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wbDp0aGlzLnd0KGEpfSx3dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueHQ6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLmxsOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Jbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuYnF8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLml0KDQpOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkdnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMuTXQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD0KYi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5NdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmxkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5sZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubGQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxDcDpmdW5jdGlvbigpe2UuYmgodGhpcy5sZCk7CmUuRmUodGhpcy5sZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy52a3x8SGE7KGZ1bmN0aW9uKGMpe2MudWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMudWt8fElhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkdnKGIsImVsZW1lbnRJRCIpO2lmKGUuYmgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9ZWxzZSB0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLndrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuQWw9dGhpcy5hWzFdO3RoaXMuSXI9dGhpcy5hWzNdO3RoaXMueHU9dGhpcy5hWzRdO3RoaXMuRHI9dGhpcy5hWzZdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueW49dGhpcy5hWzddO3RoaXMuTW89dGhpcy5hWzVdO3RoaXMuWWs9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzVdfWMueGk9YjtiLnByb3RvdHlwZT17cXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ0OnRoaXMuemwoYSl9LHpsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWw6dGhpcy5IcihhKX0sSHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Jcjp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueHU6dGhpcy5DcihhKX0sQ3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkRyOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLnhuKGEpfSx4bjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW46dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1vOnRoaXMuWGsoYSl9LFhrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMueGl8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnF0KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9CmE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sR3U6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxqbzpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLlhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9bmV3IHooYSkpO3ZhciBjPXRoaXMuZ2I9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTsKaWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5PZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuR3UoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLllqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9CiIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5nYi5zZW5kKGEpfWNhdGNoKGYpe20mJm0uSWUodGhpcy4kYS51cmwpP20uT2Q/bS5pYSgicmVxdWVzdF9mYWlsZWQiKToKZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuWWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17S3U6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxKdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17aXg6IkFkQ2xpY2tUaHJ1IixreDoiQWRFcnJvciIsbHg6IkFkU3RvcHBlZCIsb3g6IkFkTGluZWFyQ2hhbmdlIixweDoiQWRUYWdQYXJzZWQiLHN4OiJBZFZpZGVvQ29tcGxldGUiLAp2eDoiQWRMb2FkZWQiLHd4OiJBZFNraXBwZWQiLHh4OiJBZFN0YXJ0ZWQiLG14OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsbng6IkFkSW1wcmVzc2lvbiIsang6IkFkQ3JlYXRpdmVWaWV3IixxeDoiQWRWaWRlb01pZHBvaW50IixyeDoiQWRQYXVzZWQiLHR4OiJBZFZpZGVvU3RhcnQiLHV4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LGx1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5IYSYmdGhpcy5IYS5WZClmb3IodmFyIGIgaW4gdGhpcy5IYS5WZCl0aGlzLkhhLlZkLmhhc093blByb3BlcnR5KGIpJiYKYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMubXUoKTt0aGlzLkhhJiZ0aGlzLmx1KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuV3A9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9IiI7dGhpcy5laD0hMTt0aGlzLndhPXRoaXMucWQ9IiI7dGhpcy4kZz10aGlzLlY9dGhpcy5pc0VuYWJsZWQ9dGhpcy5hZj0hMTt0aGlzLnBhPVtdO3RoaXMuUGc9dGhpcy5nYz0iIjt0aGlzLnJlPSExO3RoaXMuc2Y9MDt0aGlzLkhmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiOwp0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuS2Q9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5FcD10aGlzLlFkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9dGhpcy53Zj10aGlzLk9kPXRoaXMubGU9dGhpcy5VYz0hMTt0aGlzLmliPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnJkPTA7dGhpcy5SZz0hMTt0aGlzLlFnPTFFMzt0aGlzLmJkPSExO3RoaXMuUWE9MUUzO3RoaXMuUGY9IiJ9Yy5aaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5XcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnFkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZyxzZXJ2ZXI6dGhpcy5wYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlBnLGRpc2FibGVDb29raWVUZXN0OnRoaXMucmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuc2YsSE9NQURfVkVSSUZJRUQ6dGhpcy5IZixIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsCkhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuS2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkVwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk9kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaWIsc2l0ZUNvbmZpZzp0aGlzLkZhLHNlcnZlcklkOnRoaXMuS2gsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmtiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5OaCx2bWFwczp0aGlzLmxpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5iZCxhZEZhbGxiYWNrVVJMOnRoaXMuUGZ9fSwKcnI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxYcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsCmRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmFwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy54Y3x8dGhpcy53Ynx8dGhpcy53Y3x8dGhpcy5qZSkmJihnPXRoaXMuSXMoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ZcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Cmc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LEdjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnBhJiZ0aGlzLnBhLmxlbmd0aCYmMDx0aGlzLnBhLmxlbmd0aCYmKGI9dGhpcy5wYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9CmIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuRXg7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhW3RoaXMuS2hdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxiPXRoaXMuTWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsCmIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEhzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sQz0wO0M8Zy5sZW5ndGg7QysrKXt2YXIgaz1nW0NdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMucGgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj0KdGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LElzOmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkhzKGEsdGhpcy53YykpO3JldHVybiBhfSxCcDpmdW5jdGlvbigpe3RoaXMuRmEmJnRoaXMuRmEuY2xpZW50QVBJcyYmdGhpcy54cCh0aGlzLkZhLmNsaWVudEFQSXMpfSx4cDpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuS3UoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkp1KGEucGxheWVyKTtiLmcoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLAplKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlFkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5CcCgpO3RoaXMueHMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy52cygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSx4czpmdW5jdGlvbigpe3RoaXMuRGEobmV3IHoodGhpcy5xZCt0aGlzLmdlKCJnbG9iYWwiKSksCnRoaXMubHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sdnM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5GYSYmdGhpcy5GYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuRmEmJnRoaXMuRmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxpYTpmdW5jdGlvbihhKXtpZighdGhpcy5sZSl7dGhpcy5sZT0hMDsKdmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiYKYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpO3RoaXMuTmIoKTtlLkNjKGsuQ3QpOyhiPWUuJGIodGhpcy5zZCgpKSl8fChiPWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGxyOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPQp7fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy53YX1lbHNlIGE9dGhpcy53YTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGEuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLnBhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09CnRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuS2g9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMucGEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5nYyYmdGhpcy5MYSYmdGhpcy5wYS5sZW5ndGg/dGhpcy5IYyghMSk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPQohMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTt0aGlzLkRhKGIsdGhpcy5rdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY3VzdG9tZXIiKTthP3RoaXMuRG0/dGhpcy5pYSgibm9TVk1Db25maWciKToodGhpcy5EbT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGMoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxrdjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5PZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5pYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmtjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuS2Q9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnhjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMud2I9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuY2Q9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYmQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5lcihiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMucmUmJih0aGlzLmhjPW51bGwpO3RoaXMudGY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuSHYoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuS2QpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy5ydigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnN2KCkpfX0scnY6ZnVuY3Rpb24oKXt0aGlzLnF2KCk7dGhpcy50digpfSx0djpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmEoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5rZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuVmEoKSl7aWYodGhpcy5GYSYmdGhpcy5GYS5wbGF5ZXImJnRoaXMuRmEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7CnJldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxzdjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5VYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSxxdjpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUua2QoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmljKTsKYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy53dihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlBjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5LZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sd3Y6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMueHYoYywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSx4djpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1jO2sub25lcnJvcj1lO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy5wdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHB2OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5UaCgpOnRoaXMucWYoIkFBQSIpfSxUaDpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpOwp0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVWMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuSGYpKTt0aGlzLlFkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuUWQmJnRoaXMuUWQoKX0sQXA6ZnVuY3Rpb24oKXtpZih0aGlzLndmJiYKdGhpcy5ycigpKXt2YXIgYT10aGlzLlhxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnJkfHwodGhpcy5yZD0wKTt0aGlzLnJkKys7dGhpcy5yZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2MmJihhLm9pPSEwKTtxJiZlLlpyKCkmJihhLkJnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSx5cDpmdW5jdGlvbigpe2UuVmEoKXx8ZS5iYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuR2MoKXx8KGE9dGhpcy56YShjKSxjPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7Zy5uZXR3b3JrU3RhdGU9PQpnLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxudjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5saX0senA6ZnVuY3Rpb24oKXt0aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMuaHcuYmluZCh0aGlzKSx0aGlzLmd3LmJpbmQodGhpcykpfSxodzpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuQXEoKX0sZ3c6ZnVuY3Rpb24oKXt9LEFxOmZ1bmN0aW9uKCl7ZS5DYyhrLnpxKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmlhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxuZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuSmIubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxIdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxlcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPQphLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLlpqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5mcD10aGlzLmFbMl07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaGo9CnRoaXMuYVsxXTt0aGlzLmh0PXRoaXMuYVs4XTt0aGlzLmhzPXRoaXMuYVs1XTt0aGlzLlhtPXRoaXMuYVs3XTt0aGlzLlZ2PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzhdfWMuT2w9YjtiLnByb3RvdHlwZT17ZXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZwOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tbzp0aGlzLmdqKGEpfSxnajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaGo6dGhpcy5ndChhKX0sZ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmh0OnRoaXMuZ3MoYSl9LGdzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oczp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWG06dGhpcy5VdihhKX0sVXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5PbHx8UGEsRWM9bmV3IFBhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmVwKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy4kdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy5hZD0hMTt0aGlzLlhvPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307ZS5wYigibmV3QmlnQWRJZCIpO3RoaXMua3A9ZS5hYSgxMCk7dGhpcy5tZj0wO3RoaXMuWmM9IldlcmJ1bmcgLSBbdGltZV0iOwpjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWmM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWmM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMucG89Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkdkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5iYz0hMTt0aGlzLk9wPWUuYWEoMTApO3RoaXMuR2I9ZS5hYSgxMCk7dGhpcy5FYj1lLmFhKDEwKTt0aGlzLk9oPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLlJkPXRoaXMuT2I9dGhpcy5wZT10aGlzLmdkPXRoaXMuSWQ9CnRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubWQ9dGhpcy5Ldj10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLnhkPXt9fWMuVGo9YjtiLnByb3RvdHlwZT17QnU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLmR2KCk7ZS52KGsuZm8sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTGU6ZnVuY3Rpb24oYSxiLGMsZil7dGhpcy51Yj1jO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5BcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLG5ldyBTKHRoaXMsYSx0aGlzLm1oLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLm1jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5RYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLApjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUmQ9dGhpcy5PYj10aGlzLm1kPSExO3RoaXMuYz1hO3RoaXMuUHUodGhpcy5jKTt0aGlzLnhkPW5ldyBRYSh0aGlzLmMubncsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5IcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5IZD10aGlzLmhyKGEpKSx0aGlzLk1nKGEucGFyZW50KSl9LERnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YKYnx8KGM9dGhpcy5EZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLlNxKGEpKSk7cmV0dXJuIGN9LFNxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxocjpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxnPSIiO2lmKGEuVSl7Yj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEubGIoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpnfX0sc2E6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBiPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLmpkJiZhLmpkLmVycm9yJiZhLmpkLmVycm9yLmNvZGUmJihiPWEuamQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PQpHLlhkLmNvZGU/ZS52KGsuS3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5NZSgpLGI9PUcuS2YuY29kZSYmZS52KGsuVXMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk7ZS52KGsueXEsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmV2KCk7dGhpcy5YYSgiZW1wdHkiKTticmVhaztjYXNlIHcuSWYuY29kZTplLnYoay5pdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LkxmLmNvZGU6ZS52KGsuT3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuWWQuY29kZTplLnYoay5Qdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6ZS52KGsuVnMsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLmV3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5FZi5jb2RlOmUudihrLmZ3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLlhiKGEpO3RoaXMuUmEoKX0sWGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5LZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sUHU6ZnVuY3Rpb24oYSl7dGhpcy5wZT0hMTt0aGlzLlBiPQp0aGlzLmIuSzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5QYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuJGU9ITB9Y2F0Y2goZil7fX1jYXRjaChlKXt9Yi5keT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsCnRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTt0aGlzLnBvJiZ0aGlzLnBsYXllci52ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuTy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5PW2NdLnR5cGUpJiZ0aGlzLmtvKGIsYS5PW2NdLnVybCsiIixhLk9bY10udHlwZSk7dGhpcy4kZSYmYi5sb2FkKCk7aWYodGhpcy5YaChiKSl7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5ubyhiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7CnRyeXt0aGlzLiRlP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2goayl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5LcCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuTnUoKSk6dGhpcy5jLm9yaWdpbi51Zyh3LlVkKX0sTnU6ZnVuY3Rpb24oKXt0aGlzLkNmPSEwO3RoaXMuc2I9dGhpcy5uYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLm1nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5zYj0hMCk7ZS5vZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmCmUub28odGhpcy5jLm9yaWdpbi52YSk7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9RS5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi53aCgpO3RoaXMuYi5rZigpO2ZvcihhPXRoaXMuYi5LO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIua2YoKTt0aGlzLnRhPXRoaXMuUGI9dGhpcy5iLks7dGhpcy5oaSgidnBhaWQiKTtpZih0aGlzLnNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuS2IoIm11dGVkIiwiY29udGVudCIpO2UudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5LLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmtyKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmRnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5oZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJiF0aGlzLklkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay56YywKdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuYWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuc2M9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy55dyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnp3KCksdGhpcy5iLmFjKCEwKSwhdGhpcy5PYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy5ILApjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuR2UodGhpcy5PYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmFjKCEwKSx0aGlzLkR3KCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5IdygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5GdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkl3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkV3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm1pKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5WYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkwuYmR8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5RYyYmKHRoaXMuRGY9ITEsdGhpcy5mYygpKSx0aGlzLkJ3KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuc2I9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay52ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5zYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmhlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLmFnKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5ILCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sQXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLm5jPSEwfSxCdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlhjLHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubmM9ITF9LER3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sQ3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5RaCgpO2UudihrLlRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLlhjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubWQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlFmLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxHdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5WZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxJdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbWk6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7CmUub2UoKTt0aGlzLkg9ITE7dGhpcy5SYShhKX19LHl3OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5Kdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubWkoITApfSxrbzpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuR2MoKSl7dmFyIGQ9Yi56YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuc3cuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmMoYix0aGlzLkwpKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LG5vOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmlpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmppLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmppLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0saWk6ZnVuY3Rpb24oYSl7dGhpcy5XYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldifHx0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuWG8pKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWQmJnRoaXMuWGgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5XYil7dGhpcy5hZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5aYSgpLCEwKSx0aGlzLkwudGd8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLnB3KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIua2YoKTt0aGlzLm93KCk7dGhpcy5oaSgpO3RoaXMuZWcoKTt0aGlzLmIud2goKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMubmYoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nZHx8dGhpcy5SZigpfSxSZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmdkfHwoYT90aGlzLlJhKCk6KHRoaXMuUWUoITApLHRoaXMuUmYoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmVjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkxoKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuTC5rYiYmIXRoaXMuRmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5jbyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuUmEoKX0saG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9ITEsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9ZS5IZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQSgpKTtlLmJ2KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJgp0aGlzLmMuU2QmJnRoaXMuaG8odGhpcy5jLlNkKTtpZighdGhpcy5wZSlpZih0aGlzLnBlPSEwLHRoaXMuUmR8fChlLnYoay5Ycyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy50Ynx8dGhpcy5jLnFjKXtlLnBiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm1mKys7dGhpcy5XYj10aGlzLmFkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5HZD0hMTt0cnl7dGhpcy5iLmVpKCl9Y2F0Y2goZyl7fXRoaXMuSWQ9ITA7dGhpcy5iLkJlKCk7dGhpcy5iYz0hMTt0aGlzLnhlKCkuR2goKTt0aGlzLmMudGImJnRoaXMuYy5vcmlnaW4uUmUoKTt0aGlzLmMucWMmJihhP3RoaXMuYy5vcmlnaW4ucWgoKToKdGhpcy5xZSgpKX1lbHNlIHRoaXMucWUoKX0sc3c6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5XYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkwueXAoKTt0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxqaTpmdW5jdGlvbigpe2lmKHRoaXMuS3YpdGhpcy5SYSgpO2Vsc2V7dGhpcy5iYz0hMDt0aGlzLmIuZi5BYSYmIXRoaXMuSWQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dmFyIGE9Ck1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5OdihhKTtpZighdGhpcy5PYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5SZD0hMDtlLnYoay5raSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5sZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PaCkpJiYoYz10aGlzLmMubGYtCmEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy50Yj8odGhpcy5XYj10aGlzLmFkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5HZD0hMSx0aGlzLmIuZWkoKSx0aGlzLmMub3JpZ2luLlJlKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWmMucmVwbGFjZSgiW3RpbWVdIiwKZS5DZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmZlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxiaTpmdW5jdGlvbigpe3RoaXMudmh8fCh0aGlzLnZoPSEwLHRoaXMubWR8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxOdjpmdW5jdGlvbihhKXtlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuY2l8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYmkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5RaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLAp0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5rYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5UZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMubWQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLnYoay5RZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5jaT1hKX0sUGg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsYiwhMCl9LGR2OmZ1bmN0aW9uKCl7ZS5NZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxRaDpmdW5jdGlvbigpe2UuTWQoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0sZXY6ZnVuY3Rpb24oKXtlLk1kKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sClhhOmZ1bmN0aW9uKGEpe2UuTWQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuTC5rYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxLYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5rYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkZiKXt0aGlzLnhkJiZ0aGlzLnhkLnRyYWNrJiZ0aGlzLnhkLnRyYWNrKGEpO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLmlyKHRoaXMuYy5QYSxhKX1jYXRjaChmKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgZz1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmCih0aGlzLmtlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmUuWHIoZy51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZW8sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLktlKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmMuUGE9dGhpcy5VcCh0aGlzLmMuUGEsYSl9Y2F0Y2gobSl7fX19LFphOmZ1bmN0aW9uKCl7dmFyIGE9ZS5WYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixiPSIiO3RoaXMuQ2YmJihiPSJfdnBhaWQiKTt0aGlzLlFjJiYoYj0iX3dlbGVjdCIpO3JldHVybiBhK2J9LEtlOmZ1bmN0aW9uKGEsYixjLGYsZSl7YSYmInN0cmluZyI9PQp0eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxjJiZiLmpvKGMpLGZ8fChmPXRoaXMuc2cpLGV8fChlPXRoaXMuc2cpLHRoaXMubG8oYSksdGhpcy5MLkRhKGIsZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGxvOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09Im9wZW4ifSxGaDpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJjbG9zZWQifSxIcDpmdW5jdGlvbigpe3RoaXMuZGM9e319LGd2OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuZGMpdGhpcy5kYy5oYXNPd25Qcm9wZXJ0eShiKSYmIm9wZW4iPT10aGlzLmRjW2JdJiZhKys7cmV0dXJuIGF9LGlyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sVXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpifSl9LHB3OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5xdy5iaW5kKHRoaXMpKX0scXc6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmZjKCk6dGhpcy5jLlZiJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5MLmJkfHx0aGlzLlFjKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLlZifWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYy5WYixhKX19LmJpbmQodGhpcyksNTAwKSl9LApvdzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlpjLnJlcGxhY2UoIlt0aW1lXSIsZS5DZygwKSk7CnZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5jZCYmKGI9dGhpcy5MLmNkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5jZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sRWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5jZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGhpOmZ1bmN0aW9uKGEpe2lmKCFlLm9mKHRoaXMuY29udHJvbHMpKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpjLmlkPXRoaXMuT3A7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuR2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkViO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Ndi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkx2LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk9oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmMuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmxmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXt0aGlzLkJhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLm1nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGZjOmZ1bmN0aW9uKCl7dGhpcy5CYSYmImJsb2NrIj09dGhpcy5CYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxZaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuWGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxaaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMubmM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLm5jPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLm5jPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5YYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LEx2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxNdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuc2I/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5zYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMuc2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSwkdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmVjKTt0aGlzLmdkfHx0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0scWU6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUua2QoKTshdGhpcy5MLm1jfHxlLlZhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5rZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy50aHx8IXRoaXMuTC5VYyYmInNwaWVnZWwuZGUiIT1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwicHJlcm9sbCIhPWUuQ2I/KHRoaXMuZ2Q9ITAsdGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy5uZygpKToodGhpcy50aD10aGlzLlFjPXRoaXMuRGY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5rZT0hMCxhPWUuZGcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuTGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuZ3YoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy5JZD0hMCx0aGlzLmIuQmUoKSx0aGlzLmIucXUoKSx0aGlzLmJjPSExLAplLnYoay5OcCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMueGUoKS5HaCgpKX0seGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZWc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZS5GZSh0aGlzLnZpZGVvLGEpP3RoaXMuSWgoKTp0aGlzLnlkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVmIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5zYyYmMDx0aGlzLnNjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5zYykpO3RoaXMudmlkZW8mJgp0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMua3ArIi0iK3RoaXMubWY7dGhpcy5jJiZ0aGlzLmMuSWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLklnKCkpO3JldHVybiBhfSxzZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuVGp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRwPXRoaXMuYVsyXTt0aGlzLm50PXRoaXMuYVs4XTt0aGlzLll3PXRoaXMuYVsxXTt0aGlzLm5rPXRoaXMuYVsxMF07dGhpcy5raz10aGlzLmFbNV07dGhpcy5Vbj10aGlzLmFbNV07dGhpcy5Bbj10aGlzLmFbNl07dGhpcy5lbj10aGlzLmFbMV07dGhpcy52cj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLkJpPWI7Yi5wcm90b3R5cGU9CntTcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVHA6dGhpcy5tdChhKX0sbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm50OnRoaXMuWHcoYSl9LFh3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Zdzp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubms6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmtrOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Vbjp0aGlzLnpuKGEpfSx6bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQW46dGhpcy5kbihhKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVuOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuQml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5TcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkdhPW51bGw7dGhpcy5ZPVtdO3RoaXMuVT1udWxsO3RoaXMucmM9dGhpcy50Yz0hMTt0aGlzLnZhPSIiO3RoaXMuQmY9ITE7dGhpcy5UZz0iIjtkJiZkLmVtcHR5P3RoaXMuQXMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5rbj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5rZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPQohMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bS55YShtLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVmEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlKXthPWUucGcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uSmQoYSkpKyImdHlwZT1qcyIsYj1tLnlhKG0uSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0ueWEobS5KZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnpzLmJpbmQodGhpcyksdGhpcy53cy5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkdhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5DYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuQ2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkNifHx0aGlzLmJzKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLm52KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGJzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0senM6ZnVuY3Rpb24oYSl7dGhpcy5adChhKTt0cnl7dGhpcy5HYT1hLnJlc3BvbnNlWE1MLHRoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOgpHLkpmfSkpfSxBczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWWQpKX10aGlzLlk9dGhpcy5FZygpO3RoaXMudGM9dGhpcy5yZigpO3RoaXMucmM9dGhpcy5VaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5KYygpOnRoaXMuc2EodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkJmP0cuWGQ6Ry5KZn0pKX0sd3M6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5JZix7ZGVwdGg6YX0pKX0sSmM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5kcygpP3RoaXMueXYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMuUnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMuY3coKSYmdGhpcy5XZSh0aGlzLlJwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPwoodGhpcy50Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5SZSgpfSxxaDpmdW5jdGlvbigpe3RoaXMucmM/KHRoaXMucmM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSmMoKSk6dGhpcy5wYXJlbnQucWgoKX0sY3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52digpP3RoaXMudXYoKT8hMDooLTEhPXRoaXMuRGMoKT90aGlzLnNhKHRoaXMuU2Eody5UZCkpOnRoaXMuc2EodGhpcy5TYSh3LkVmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5TYyxHLktmKSksITEpfSxXZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5TZHx8KGEuU2Q9W10pO2EuU2QucHVzaCh0aGlzLlRnKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuQWc7dGhpcy5wYXJlbnQuV2UoYSl9LFJwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuRGMoKTthLk89dGhpcy5LZygpO2EuVmI9dGhpcy5UcSgpO2Eubnc9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5RcSgpO2EubGY9dGhpcy5ncihhLmR1cmF0aW9uKTthLmFiPWEuYWI/YS5hYjotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuQWc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLmFiPWIuYWI/Yi5hYjotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuQWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlVxKCkpOmIuUGEuY29uY2F0KHRoaXMuYnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5YYiYmdGhpcy5wYXJlbnQuWGIoYiksYT0wLHRoaXMuSmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxYYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5YYihhKX0sdWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30seXY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSx2djpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuS2coKS5sZW5ndGh9LHV2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSxVaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxadDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuQmY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sZHM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk5nKCkubGVuZ3RofSxOZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LFJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5sYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuYWgoYS5wYXJlbnROb2RlKTohMX0sYnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sVXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFRxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxGeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5wZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxncjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLmF2KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5wZChhKToiIn0scGQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLmtufHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp2PXRoaXMuYVs1XTt0aGlzLm5tPXRoaXMuYVsxXTt0aGlzLmlsPXRoaXMuYVs4XTt0aGlzLnhsPXRoaXMuYVs3XTt0aGlzLlJ3PXRoaXMuYVsxMF07dGhpcy5ObD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLlBxPWI7Yi5wcm90b3R5cGU9e0l2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kdjp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlsOnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54bDoKdGhpcy5RdyhhKX0sUXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJ3OnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlBxfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Jdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5mbT1iO2IucHJvdG90eXBlPXtLcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSwkcTpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy4kcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sa3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmZtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5UaT10aGlzLmFbOF07dGhpcy5Paz10aGlzLmFbOV07dGhpcy5lbT0KdGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzZdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuZ2s9dGhpcy5hWzRdO3RoaXMuenQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5adj1iO2IucHJvdG90eXBlPXtTaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVGk6dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk9rOnRoaXMuZG0oYSl9LGRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbTp0aGlzLkN2KGEpfSxDdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHY6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nazp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlp2fHxXYSxIYz1uZXcgV2EoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuU2koNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApneDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGh4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlB2PXRoaXMuYVs4XTt0aGlzLlZtPXRoaXMuYVs3XTt0aGlzLkRvPXRoaXMuYVsxMF07dGhpcy5QaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLkV2PWI7Yi5wcm90b3R5cGU9e092OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qdjp0aGlzLlVtKGEpfSxVbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm06dGhpcy5DbyhhKX0sQ286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkRvOnRoaXMuT2koYSl9LE9pOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuRXZ8fFhhLEljPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk92KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj0KYTt0aGlzLmpkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuRmo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkZqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KaT10aGlzLmFbMV07dGhpcy5VdD10aGlzLmFbN107dGhpcy53aT10aGlzLmFbMV07dGhpcy5jbT10aGlzLmFbNl07dGhpcy5VdT10aGlzLmFbNl07dGhpcy5HbD10aGlzLmFbMTBdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuUHI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy54bT1iO2IucHJvdG90eXBlPXtJaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSmk6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdDp0aGlzLnZpKGEpfSx2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5ibShhKX0sYm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5jbTp0aGlzLlR1KGEpfSxUdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXU6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdsOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50azp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUHI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLnhtfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5JaSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSGg9YTt0aGlzLnZpZGVvPWI7dGhpcy5QZD1bXTt0aGlzLkVoPVtdO3RoaXMuU2U9W107dGhpcy5ydz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLmpsPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLiR4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm51LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmZ1LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwpsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuUGQucHVzaCh7c3JjOmMsZnJhbWU6ZyxCdDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5TZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlNlW2JdO2MudHlwZT09PWEmJmMudXAodGhpcy5WcShhKSl9fSxWcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpeTohMCxoeTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntXeDoidmlkZW8iLGt5OiJqc0N1c3RvbSIsbHk6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbXk6MSxHeDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LGpyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5QZC5sZW5ndGg7YisrKWlmKHRoaXMuUGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5QZFtiXS5CdDtyZXR1cm4iIn0sbnU6ZnVuY3Rpb24oYSxiKXt0aGlzLkVoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLmpyKGIpLHZlbmRvcjpifSk7CnRoaXMuY3YoKX0sZnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnJ3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSx1cDpiLGZ5OiExfSl9LGN2OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS4kcnx8KGEuWngoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmp5LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS4kcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5qbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmo9dGhpcy5hWzEwXTt0aGlzLm5sPXRoaXMuYVsxXTt0aGlzLlNrPQp0aGlzLmFbNV07dGhpcy5Ecz10aGlzLmFbNV07dGhpcy5ncT10aGlzLmFbMl07dGhpcy52bD10aGlzLmFbM107dGhpcy5zbT10aGlzLmFbMl07dGhpcy5DbT10aGlzLmFbM107dGhpcy5Tbj10aGlzLmFbNF07dGhpcy5Raz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLkdzPWI7Yi5wcm90b3R5cGU9e2FqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5iajp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmw6dGhpcy5SayhhKX0sUms6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNrOnRoaXMuQ3MoYSl9LENzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy51bChhKX0sdWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52bDp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNtOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuQ206dGhpcy5SbihhKX0sUm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNuOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Razp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuR3N8fFphLEtjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLmFqKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMuZj1hO3RoaXMuamI9YS5GZygpO3RoaXMuSz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLksuaWQ9ZS5hYSgxMCk7dGhpcy5GPUUucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5jZz0hMTt0aGlzLlRiPVtdfWMub2o9YjtiLnByb3RvdHlwZT17T3E6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5PcShhKTtmb3IodmFyIGI9MCxjPTAsZT0hMSxnPXRoaXMud3IoYSksaz17fTthOyliKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGp2OmZ1bmN0aW9uKCl7dGhpcy5jZz0hMH0sZWk6ZnVuY3Rpb24oKXt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LAp3aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLnpjLHRoaXMuZi5zKCkpfSxxdTpmdW5jdGlvbigpe3RoaXMuY2d8fCh0aGlzLmYucGxheSgpLGUudihrLmZkLHRoaXMuZi5zKCkpKX0sa2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuSy5zdHlsZS56SW5kZXg9YTt0aGlzLksuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5LLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLksuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLksuc3R5bGUuYm94U2l6aW5nPXRoaXMuamIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSy5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PXRoaXMuamIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5qYik7dGhpcy5mLk1jJiZ0aGlzLmYuTWMoKT90aGlzLmYuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5LKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSx3cjpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGImJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sSXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249CmIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sYWM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JcSh0aGlzLmpiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkJlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5NYygpPyh0aGlzLksuc3R5bGUubGVmdD0iMHB4Iix0aGlzLksuc3R5bGUudG9wPSIwcHgiKToodGhpcy5LLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5LLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5LLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KwoicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLm9mKHRoaXMuSykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGFnOmZ1bmN0aW9uKGEpe3RoaXMuVGJ8fCh0aGlzLlRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5UYi5wdXNoKGEpfSxCZTpmdW5jdGlvbigpe3RoaXMuSyYmdGhpcy5LLnBhcmVudE5vZGUmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkspO3RoaXMuRiYmdGhpcy5GLnBhdXNlJiZ0aGlzLkYucGF1c2UoKX19fSkoYyk7Zm9yKHZhciAkYT1jLm9qfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtFLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FbD10aGlzLmFbN107dGhpcy54cT10aGlzLmFbMV07dGhpcy55bz10aGlzLmFbMV07dGhpcy5MbD10aGlzLmFbNF07dGhpcy5ycT10aGlzLmFbM107dGhpcy5Odz10aGlzLmFbMl07dGhpcy5Hbz10aGlzLmFbMV07dGhpcy5haz10aGlzLmFbNF07dGhpcy51bj10aGlzLmFbNl07dGhpcy5qPQp0aGlzLmFbMl19Yy5ocD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWw6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhxOnRoaXMueG8oYSl9LHhvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55bzp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGw6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJxOnRoaXMuTXcoYSl9LE13OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Odzp0aGlzLkZvKGEpfSxGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR286dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFrOnRoaXMudG4oYSl9LHRuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJiPWMuaHB8fGJiLExjPQpuZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5EbCg0KTsoZnVuY3Rpb24oYyl7Yy5TbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5XKGEpO3RoaXMuRGQoYik7dGhpcy5xZygpfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0scWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkthKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLAphP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sRWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5LYSgpOwppZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLlNsfHxjYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuVWY9dGhpcy5XZj10aGlzLlhnPXRoaXMuZWE9dGhpcy51Zj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkVxKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51Zj0hMDt0aGlzLlhnJiZ0aGlzLmtnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsCiJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJmEuYmMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuWGc9ITA7dGhpcy5rZygpfS5iaW5kKHRoaXMpKTt0aGlzLmdnKCl9LGtnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Ipe3RoaXMuZGQoKTtpZighdGhpcy51ZiYmIXRoaXMuZGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnVmJiZ0aGlzLlVmJiYhdGhpcy5XZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGRkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpOwpyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sTGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sZ2c6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPXRoaXMuTGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5XZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlVmPWIuRHh9dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSxIeDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5VeCgpOiExfSxEYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkRjKCk6LTF9LGNyOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LEVxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlNifHwzMDI9PXRoaXMuU2I/dGhpcy5lYT0hMDp0aGlzLnUoImFkZXJyb3IiLHRoaXMuU2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOmIuRWUoKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5jcihiKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksCjJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy5SbHx8ZGI7KGZ1bmN0aW9uKGMpe2MuVGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxhczpmdW5jdGlvbigpe3dpbmRvdy5PTy5sbS5Ybi5Wbj93aW5kb3cuT08ubG0uWG4uVm4uQngoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYXMoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS55ZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgY2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IGRiKGMsCnRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy5UbHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ0PXRoaXMuYVs1XTt0aGlzLnZ3PXRoaXMuYVs4XTt0aGlzLllwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzhdfWMuYXE9YjtiLnByb3RvdHlwZT17YXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJ0OnRoaXMudXcoYSl9LHV3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52dzp0aGlzLlhwKGEpfSxYcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWXA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLmFxfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuYXQoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLnpoKCl9LHpoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ZaXx8aGI7KGZ1bmN0aW9uKGMpe2MuWGk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0saGc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucmEoKTp0aGlzLm0oKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuaGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sQ2g6ZnVuY3Rpb24oYil7Yj1uZXcgaGIoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fChiLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlIoYiksKG5ldyBpYihiLHRoaXMuSSkpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZxfHwodGhpcy5GcT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuQ2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkNoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7CnRoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuWml8fGpiLFQ9bmV3IGpiKHIpO1QuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZ3PXRoaXMuYVsxXTt0aGlzLlFsPXRoaXMuYVsxXTt0aGlzLnFzPXRoaXMuYVs2XTt0aGlzLkF2PXRoaXMuYVsxMF07dGhpcy5paz10aGlzLmFbMV07dGhpcy5ycD10aGlzLmFbOV07dGhpcy5idT10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLkFpPWI7Yi5wcm90b3R5cGU9e1V3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Wdzp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFsOnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xczp0aGlzLnp2KGEpfSx6djpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQXY6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5pazp0aGlzLnFwKGEpfSxxcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJwOnRoaXMuYXUoYSl9LGF1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5idTp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkFpfHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5Vdyg0KTsoZnVuY3Rpb24oYyl7Yy5ObT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuTm18fFU7KGZ1bmN0aW9uKGMpe2MuTW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guWWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlljKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuJHMoYSl9LmJpbmQodGhpcykpO3guWWMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5ZYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3gucXIoKX0sJHM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwKMzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLk1tfHxWOyhmdW5jdGlvbihjKXtjLk9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTsKdGhpcy53ZCYmKGI9ZS5WcChiLHRoaXMud2QpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLndkfHwodGhpcy53ZD1bXSksdGhpcy53ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWWM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8Cih0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LEJ2OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5wdSgpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxxcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9CmEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5CdihiKX19KX0pKGMpO3ZhciBsYj1jLk9tfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpuPXRoaXMuYVsxXTt0aGlzLldrPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMudHc9YjtiLnByb3RvdHlwZT17aG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuVmsoYSl9LFZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuV2s6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYj1jLnR3fHxtYixPYz1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy5obig0KTsoZnVuY3Rpb24oYyl7Yy5VaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxBYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuVWl8fG5iOyhmdW5jdGlvbihjKXtjLlZpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMudSgibm9BZCIsInBsYXllZCIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLlZpfHxvYjsoZnVuY3Rpb24oYyl7Yy5XaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpOwppZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBuYihkKTt0aGlzLk4oZyl8fCh0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLldpfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1wPXRoaXMuYVs1XTt0aGlzLmVxPXRoaXMuYVs3XTt0aGlzLkp0PXRoaXMuYVs0XTt0aGlzLlVrPXRoaXMuYVs2XTt0aGlzLmduPXRoaXMuYVs4XTt0aGlzLndtPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuUXU9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1wOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lcTp0aGlzLkl0KGEpfSxJdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSnQ6dGhpcy5UayhhKX0sVGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVrOnRoaXMuZm4oYSl9LGZuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbjp0aGlzLnZtKGEpfSx2bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj0KYy5RdXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMubHAoNCk7KGZ1bmN0aW9uKGMpe2MuSWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuZXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZXU6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJgphLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFlnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuSWx8fHNiOyhmdW5jdGlvbihjKXtjLkhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLkhsfHx0YjsoZnVuY3Rpb24oYyl7Yy5KbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9CmwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5KbHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZmo9dGhpcy5hWzddO3RoaXMuUHM9dGhpcy5hWzNdO3RoaXMuc3U9dGhpcy5hWzZdO3RoaXMuZng9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy5Hcj1iO2IucHJvdG90eXBlPXtlajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmo6dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBzOgp0aGlzLnJ1KGEpfSxydTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnN1OnRoaXMuZXgoYSl9LGV4OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5meDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuR3J8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmVqKDQpOyhmdW5jdGlvbihjKXtjLnFuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMucW58fAp3YjsoZnVuY3Rpb24oYyl7Yy5wbj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxZYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sY3U6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5jdSh0aGlzLkNhKToodGhpcy5DYT10aGlzLlliKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpO3JldHVybn1pZighdGhpcy51Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZiLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmZiW2FdJiYzMDMhPXRoaXMuZmJbYV0mJjQwMyE9dGhpcy5mYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKNTAwKX19KX0pKGMpO3ZhciB4Yj1jLnBufHx4YjsoZnVuY3Rpb24oYyl7Yy5ybj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMucm58fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MbT10aGlzLmFbMV07dGhpcy5HcD10aGlzLmFbMV07dGhpcy5SbT10aGlzLmFbOV07dGhpcy5Rbj10aGlzLmFbOV07CnRoaXMua3E9dGhpcy5hWzEwXTt0aGlzLnp1PXRoaXMuYVs2XTt0aGlzLnVvPXRoaXMuYVsyXTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzJdfWMuY249YjtiLnByb3RvdHlwZT17S206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxtOnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HcDp0aGlzLlFtKGEpfSxRbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUm06dGhpcy5QbihhKX0sUG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlFuOnRoaXMuanEoYSl9LGpxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcTp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuenU6dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVvOnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT8KdGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLmNufHxBYixSYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5LbSg0KTsoZnVuY3Rpb24oYyl7Yy56bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5YZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuTHQoKX0uYmluZCh0aGlzKSw1MDApfSxMdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJgphJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5YZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5YZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxmdjpmdW5jdGlvbigpe3RoaXMuWGU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBCYj1jLnptfHxCYjsoZnVuY3Rpb24oYyl7Yy55bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubGM9MH0sZzpmdW5jdGlvbigpe3RoaXMuRnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmxjfHwodGhpcy5sYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5sY3x8dGhpcy5sYysrLHRoaXMubGM8PXRoaXMuRnM/KHRoaXMubGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLmZ2KCksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBDYj1jLnltfHxDYjsoZnVuY3Rpb24oYyl7Yy5BbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgQ2IoYix0aGlzLkkpKS5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBEYj1jLkFtfHxEYixFYj1uZXcgRGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnE9dGhpcy5hWzZdO3RoaXMubHQ9dGhpcy5hWzNdO3RoaXMuSGk9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy50dD1iO2IucHJvdG90eXBlPXt1cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnE6dGhpcy5rdChhKX0sa3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmx0OnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLnR0fHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1TYy51cSg0KTsoZnVuY3Rpb24oYyl7Yy5wbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLnBtfHxHYjsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzsKYSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLkxwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMub2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnNzKCk6dGhpcy5qZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LExwOmZ1bmN0aW9uKCl7dGhpcy5TZigpfHx0aGlzLm0oITApfSxzczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm9kKCk7IWIucWEmJmIuWSYmYi5BeCYmYi5DeCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoKX0uYmluZCh0aGlzKSwxMDApfSxvZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVoKWZvcih2YXIgYj1sLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLmlkLApjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudWg9YltjXSk7cmV0dXJuIHRoaXMudWh9LFZ4OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLm9kKCkuYWRzTG9hZGVyP3RoaXMuRyghMCk6dGhpcy5HKCk6dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEhiPWMub218fEhiOyhmdW5jdGlvbihjKXtjLnFtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwucGxheWVyYXBpKXt2YXIgYj1sLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgSGIoYyx0aGlzLkkpKS5nKCkpfXJldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgSWI9Yy5xbXx8SWIsSmI9bmV3IEliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNqPXRoaXMuYVszXTt0aGlzLnduPXRoaXMuYVs0XTt0aGlzLlNqPXRoaXMuYVs1XTt0aGlzLktxPXRoaXMuYVs2XTt0aGlzLkRpPXRoaXMuYVs4XTt0aGlzLnNvPXRoaXMuYVs3XTt0aGlzLldvPXRoaXMuYVs2XTt0aGlzLnppPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzZdfWMucnM9YjtiLnByb3RvdHlwZT17Qmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNqOnRoaXMudm4oYSl9LHZuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud246dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNqOgp0aGlzLkpxKGEpfSxKcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS3E6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRpOnRoaXMucm8oYSl9LHJvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zbzp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV286dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56aTp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnJzfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5Caig0KTsoZnVuY3Rpb24oYyl7Yy5mbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxUeDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxNYzpmdW5jdGlvbigpe3JldHVybiEwfSxLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9CmMuZmx8fFg7KGZ1bmN0aW9uKGMpe2MuZGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlllJiZiIT10aGlzLlllfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLmF5KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuZGx8fFk7KGZ1bmN0aW9uKGMpe2MuZ2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5uYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuZ2x8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY2s9dGhpcy5hWzEwXTt0aGlzLiRwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuRW89YjtiLnByb3RvdHlwZT17Yms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmNrOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuRW98fE5iLFVjPW5ldyBOYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5iayg0KTsoZnVuY3Rpb24oYyl7Yy5Qaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LEF1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LApBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5Qanx8T2I7KGZ1bmN0aW9uKGMpe2MuT2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5Panx8UGI7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpOwp2YXIgUWI9Yy5Ranx8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs2XTt0aGlzLkZtPXRoaXMuYVsyXTt0aGlzLmNsPXRoaXMuYVsxXTt0aGlzLlN1PXRoaXMuYVs2XTt0aGlzLld0PXRoaXMuYVs0XTt0aGlzLldsPXRoaXMuYVs3XTt0aGlzLnZ0PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzZdfWMuRnQ9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRsOnRoaXMuRW0oYSl9LEVtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GbTp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5SdShhKX0sUnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlN1OnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV3Q6dGhpcy5WbChhKX0sClZsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbDp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLkZ0fHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Fbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSwKTmQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LGR1OmZ1bmN0aW9uKCl7dGhpcy5SYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJjfHwodGhpcy5SYz0hMCx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5OZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxBYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuRW58fFRiOyhmdW5jdGlvbihjKXtjLkRuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LERoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSwKYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VYihhKX0uYmluZCh0aGlzKSkpLGImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5EaC5iaW5kKHRoaXMpLDEwKX0sVWI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT0KYS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxPZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5VYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuT2YoKTt0aGlzLmd1KCl9LGd1OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGIpe3RoaXMuVWIoYil9KX0sbTpmdW5jdGlvbihiKXt0aGlzLiR0P3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihiKXt0aGlzLiR0PSEwO2lmKGImJmIuZGV0YWlsKWZvcih2YXIgYSBpbiBiLmRldGFpbCkiYWRUYWdVcmwiPT1hJiYoYi5kZXRhaWxbYV18fHRoaXMuVWIoYikpfX0pfSkoYyk7dmFyIFViPWMuRG58fFViOyhmdW5jdGlvbihjKXtjLkZuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIuZHUoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpOwp2YXIgVmI9Yy5Gbnx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLlluPWI7Yi5wcm90b3R5cGU9e2pzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLllufHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy5qcyg0KTsoZnVuY3Rpb24oYyl7Yy5abT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLnhoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT0KYi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLk5zPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxBdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTnN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy54aCYmCih0aGlzLnhoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy5abXx8TzsoZnVuY3Rpb24oYyl7Yy5ZbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuTXUoKTp0aGlzLm0oITApLCEwO3RoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubSgpOnRoaXMubSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnVlPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlM9CnRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLlltfHxQOyhmdW5jdGlvbihjKXtjLiRtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwKKHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuY2YoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLiRtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMucms9dGhpcy5hWzZdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy5Xdj1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSHQ6CnRoaXMucWsoYSl9LHFrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5yazp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Xdnx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuR3QoNCk7KGZ1bmN0aW9uKGMpe2MuSms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ka3x8WjsoZnVuY3Rpb24oYyl7Yy5Jaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5yYigpLCEwO3RoaXMuVWcrKztpZigxMDx0aGlzLlVnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0KITB9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLklrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Laz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLktrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY3A9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzldO3RoaXMuTm49dGhpcy5hWzZdO3RoaXMuS3I9dGhpcy5hWzVdO3RoaXMuSG49dGhpcy5hWzRdO3RoaXMucHE9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5saz1iO2IucHJvdG90eXBlPXticDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY3A6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5lazp0aGlzLk1uKGEpfSxNbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTm46dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktyOnRoaXMuR24oYSl9LEduOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Ibjp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLmxrfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5icCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJgphPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Nanx8ZGM7KGZ1bmN0aW9uKGMpe2MuTGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaWcoKX0saWc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLkxqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Oaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLk5qfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHQ9dGhpcy5hWzldO3RoaXMucmo9dGhpcy5hWzZdO3RoaXMuQnI9dGhpcy5hWzNdO3RoaXMuS3M9dGhpcy5hWzNdO3RoaXMuV3U9dGhpcy5hWzEwXTt0aGlzLkpuPXRoaXMuYVs1XTt0aGlzLnB0PXRoaXMuYVs2XTsKdGhpcy5qPXRoaXMuYVsxMF19Yy5zdD1iO2IucHJvdG90eXBlPXtjdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZHQ6dGhpcy5xaihhKX0scWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnJqOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ccjp0aGlzLkpzKGEpfSxKczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3M6dGhpcy5WdShhKX0sVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLld1OnRoaXMuSW4oYSl9LEluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kbjp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucHQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLnN0fHxoYyxaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9WmMuY3QoNCk7KGZ1bmN0aW9uKGMpe2Mucmk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMucml8fGljOyhmdW5jdGlvbihjKXtjLnBpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGZnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5mZy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnBpfHxqYzsoZnVuY3Rpb24oYyl7Yy5zaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9Cm5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnNpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQW89dGhpcy5hWzJdO3RoaXMuRWo9dGhpcy5hWzRdO3RoaXMuQ2w9dGhpcy5hWzhdO3RoaXMuVG09dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzddO3RoaXMuaj0KdGhpcy5hWzNdfWMuUXM9YjtiLnByb3RvdHlwZT17em86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkFvOnRoaXMuRGooYSl9LERqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fajp0aGlzLkJsKGEpfSxCbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2w6dGhpcy5TbShhKX0sU206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRtOnRoaXMuSm8oYSl9LEpvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMuUXN8fG1jLCRjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLnpvKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdOwp0aGlzLmJmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj8KbnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcWI/bnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLmhtPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuZHIoYSk6W10sYjt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107CnRoaXMueGYoYikmJih0aGlzLnpkLnB1c2goYiksdGhpcy5KaChiKSl9fSx4ZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmJmW2NdLHRoaXMueGYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5nKCl9LGh2OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG5jPWMuaG18fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5RcD10aGlzLmFbMV07dGhpcy5Gaz10aGlzLmFbN107dGhpcy5NcT10aGlzLmFbMTBdO3RoaXMuTXM9dGhpcy5hWzddO3RoaXMuWXU9dGhpcy5hWzZdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMueWo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5ncD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUXA6dGhpcy5FayhhKX0sRWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZrOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5NcTp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTXM6dGhpcy5YdShhKX0sWHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLll1OnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cjp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5ncHx8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9YWQuUHAoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQ2Moay5kdyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywKITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkNjKGsuV3MpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgYmQ9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLlpnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWmcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTsKSS5rYSgpO3ZhciBjZD1iZChmdW5jdGlvbigpe2Uuemcod2luZG93LEkuUXIoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhxPXRoaXMuYVs3XTt0aGlzLll2PXRoaXMuYVs0XTt0aGlzLmJvPXRoaXMuYVszXTt0aGlzLm5yPXRoaXMuYVs3XTt0aGlzLmpqPXRoaXMuYVs0XTt0aGlzLlFvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMuQm89YjtiLnByb3RvdHlwZT17R3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYm86dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5yOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuamo6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5Cb3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuR3EoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnloPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy51ZD0wO3RoaXMuZWI9IiI7dGhpcy5BZD1bXTt0aGlzLkJkPTA7dGhpcy5BaD0hMTt0aGlzLlplPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnRpPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3RoaXMueWg9YX0saGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKRHU6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSxOYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5iYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLlRyKCkpdGhpcy5uYi5sKHRoaXMubmIucWQsCnRoaXMubmIud2EsdGhpcy5uYi5hZixmdW5jdGlvbigpe3RoaXMuTmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLkJjKTtlbHNlIGlmKHRoaXMuc3IoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmp2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm5iLGcpO2wuQnUodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkVzKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJgooYz10aGlzLnBsYXllci5KZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5MZShhLGMsZik7dGhpcy5wbGF5ZXIuTGgobCl9fSxUcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnVkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yj8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LCR1OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UuZ2YoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX0sWnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueWgpe2UuZ2YoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLkl1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnZnKGMpKT90aGlzLk5jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LGp1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuT3UodGhpcy5adS5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuTmEoKX0sRmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZ2YoIm1pZHJvbGwiKTtpZighdGhpcy5uaCl7dGhpcy5uaD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5OYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX19LGl1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHUodGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy4kdSgpO3RoaXMucGxheWVyLk9lJiZ0aGlzLml1KCk7dGhpcy5qdSgpfSxrdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5BZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuV3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxzcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSx2dTpmdW5jdGlvbihhKXt0aGlzLkFoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuUHQuYmluZCh0aGlzKSl9LFB0OmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLlplLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy5BaCgpfSxFczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5aZS5sZW5ndGg7YysrKWI9CnRoaXMuWmVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubXY9dGhpcy5hWzRdO3RoaXMuS2o9dGhpcy5hWzNdO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnRxPXRoaXMuYVs1XTt0aGlzLlR3PXRoaXMuYVszXTt0aGlzLmZ0PXRoaXMuYVs4XTt0aGlzLlR2PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzldfWMuUG09YjtiLnByb3RvdHlwZT17bHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm12OnRoaXMuSmooYSl9LEpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2o6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMuc3EoYSl9LHNxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6CnRoaXMuU3coYSl9LFN3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udzp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZnQ6dGhpcy5TdihhKX0sU3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Udjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuUG18fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLmx2KDQpfSkuY2FsbChhdUZlZXNodWVlWWFpeW9vLGF1RmVlc2h1ZWVZYWl5b28pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
5.9.139.135
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.135.139.9.5.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- 5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
|
GET
H/1.1
|
200
OK
|
index.html
cmp.teads.mgr.consensu.org/
Frame 2F11
|
0
0
|
30ms
5ms
|
Document
text/html |
2a02:26f0:6c00:293::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.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:293::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 5020
|
0
0
|
18ms
6ms
|
Document
text/html |
2a02:26f0:6c00:293::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.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:293::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
|
6ms
6ms
|
Image
image/gif |
172.227.124.249
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
35ms
33ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
117ms
91ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20f11
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
117ms
91ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20tagtype%203
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
35ms
33ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
117ms
92ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20f24
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
p
sb.scorecardresearch.com/
|
43 B
309 B
|
12ms
7ms
|
Image
image/gif |
172.227.124.249
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
33ms
32ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
117ms
97ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20f11
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
110ms
98ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20tagtype%203
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
45ms
31ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
119ms
105ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20f24
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
DATA
|
200
OK
|
truncated
/
Frame E17A
|
218 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb51.s400.meetrics.net/
|
43 B
308 B
|
13ms
1ms
|
Image
image/gif |
136.243.4.81
HETZNER-AS
|
|
General
- Full URL
- https://lb51.s400.meetrics.net/data?/UN35EVNAA/k0FSImvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AyyAzzA1yAxwAxyAmvFytFh0FjvFklF9CEyhFukFCvFvzF0lFymBhkF29BxwA5yAxyAy0A11AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA54A3zA5yA03AmjEpkF9xAz4Ay5Ax4A3yA50AzmAzpF6lF93Ay4A45BwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1xA54A3zA5yA03AmhEwkF91Ax5A43Az5Ay0A3mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AyyAzzA1yAxwA55ALlnFCUkzFUCPUBAAAAAAABmo7APAAAFAAmo7ThRjAPAAAAAAsDABhRjAZBAAOA55A55A85B55A58E55A55AGAy0A0yA2yArhRjAPKDAAAAkaAPA5iAPAAAAAAkaAIA5iAPAAAAAAsDAHhRjAPAAAAAAgBAKhRjASksFMFjAAAAAAAAAAAAEAAAmo7AAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFGA3yA44E5wAMAxzA4yA5xA43Ay5A0zAGAkpFylFj0FAAAAKAxwA5yAxyAy0A11AKA1xA54A3zA5yA03AGAihFuuFlyFKA1xA54A3zA5yA03AKA1xA54A3zA5yA03AwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFdAAAsDAxYAAAAFAAAhRjAAAAAMACyFhuFkCFvvFz0FlyFAAAAAAAAAAAAAAAAQtjFMcEYWA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.81
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h229.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb51.s400.meetrics.net/
|
43 B
308 B
|
1ms
0ms
|
Image
image/gif |
136.243.4.81
HETZNER-AS
|
|
General
- Full URL
- https://lb51.s400.meetrics.net/data?/UN35FWNAA/k0FgMmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AyyAzzA1yAxwAxyAmvFytFh0FjvFklF9CEyhFukFCvFvzF0lFymBhkF29BxwA5yAxyAy0A11AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA54A3zA5yA03AmjEpkF9xAz4Ay5Ax4A3yA50AzmAzpF6lF93Ay4A45BwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1xA54A3zA5yA03AmhEwkF91Ax5A43Az5Ay0A3mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AyyAzzA1yAxwA55AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA40A1wAz3A1mAjwFpkF9kElzFr0FvwFmhEwhF91Ax5A35AxyA02A1mAjpFk9BxzA4yA5wA4zAzxA41AmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9yEljF0hFunFslFmhEwjF91Ax5A35AxyA02A1mAhwFk9B1xA53A5xAy0A21AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AyyAzzA1yAx1Aw2ALlnFDTkzFtPNDAAAAAAABA8nAPAAAFAAA8nTbosAPAAAJPAKCABbosASksFeFjAAAAAAAAAAAAEAAAA8nAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA5wA4zAzxA41AGAkpFylFj0FAAAAIAy4A01AwzA31AKA1xA53A5xAy0A21AJAylFj0FhuFnsFlBFKA1xA53A5xAy0A21AKA1xA53A5xAy0A21AzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAKCAsEA6DAFAAAbosAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFkf+yYA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.81
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h229.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.giga.de/
Frame E2F6
|
24 B
409 B
|
50ms
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,dmFyIGF1RmVlc2h1ZWVZYWl5b289YXVGZWVzaHVlZVlhaXlvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5wcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5EdShtKTthLkN1KGwpO2Eua3UoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5MdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXQ9dGhpcy5hWzVdO3RoaXMuTG49dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLnFvPWI7Yi5wcm90b3R5cGU9e1h0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZdDp0aGlzLktuKGEpfSxLbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTG46dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndvOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5GaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMucW98fGhhLHNjPQpuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5YdCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5wcD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuT3QuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5Waj1iO2IucHJvdG90eXBlPXtpdjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTsKdGhpcy5vYlthXSs9MTs1PHRoaXMub2JbYV0mJiF0aGlzLlNnW2FdJiYodGhpcy5TZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLml2KCksITApKX0sb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sb286ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSwKe3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxPdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5OdChhLmRhdGEpfSxOdDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9CkpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sSGc6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbW86ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLk5xKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PQpiLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LE5xOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxjczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9CmFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sb2Y6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOgohMTohMX0sRmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3E9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmUoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYKMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09CnR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eT1rO3U9bTtyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHEsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChxLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7Cm09bSt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihtKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxxPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sWnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxrZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17UWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sJGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCnhyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LHNuOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxhbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LEhtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sWW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5RaSgpfHxhLiRpKCl8fGEueHIoKXx8YS5VbCgpfHxhLnNuKCl8fGEuYWwoKXx8YS5IbSgpfX07cmV0dXJuIG51bGwhPWEuWW8oKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpOwp2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxmcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sVnA6ZnVuY3Rpb24oYSwKYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LGF2OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj0KYX0semc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5DYjt0aGlzLmVlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sUXQ6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJgoxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5mcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGJ2OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9CnRoaXMuWmIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmVlKGEpfSxlZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlF0KGEpO2lmKGIpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKGIpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTWQ6ZnVuY3Rpb24oYSl7aWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLnpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuY3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8CnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMueGcoYSkpcmV0dXJuIHRoaXMueGcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSwKZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnNkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLm1vKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIGw9ZXx8bTtlPSEwO2smJihlPSExKTtpZihsJiZsLlYpaWYobC5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLApjLGwsZyxrKX0uYmluZCh0aGlzKSw1MDApfSxraDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5czpmdW5jdGlvbihhLApiLGQpe3RoaXMua2goYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuT2MpZm9yKHZhciBjIGluIHRoaXMuT2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5PY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5iYihhLGYuTGEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnlzKGYuc2QoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEx1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LFd3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIiwKZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxhcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sWHI6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0KMDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLlZqfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlVqPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuQ3Q9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuS3c9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi55cT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLllmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlFmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuY289e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07CmIuaXc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlVzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnpxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Pdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLk5wPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5mZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTsKYi56Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuWGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLmZvPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5YYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLmVvPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTsKYi5Ycz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnZkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuSnc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZXc9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmZ3PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Xcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5Vanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs2XX1jLnBqPWI7Yi5wcm90b3R5cGU9e0Z2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIGphPWMucGp8fGphLHZjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Gdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLldqPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxsYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sYXI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrCm5hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG5kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5uZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm5kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sa2E6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLmxhKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm5kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxRcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuYXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5uZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9Yy5Xanx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50cD10aGlzLmFbNV07dGhpcy5rbT10aGlzLmFbOF07dGhpcy4kbz10aGlzLmFbN107dGhpcy5OaT10aGlzLmFbOF07dGhpcy4kdz10aGlzLmFbMV07dGhpcy5sdz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs3XX0KYy5ucT1iO2IucHJvdG90eXBlPXtzcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudHA6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmttOnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbzp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmk6dGhpcy5adyhhKX0sWnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR3OnRoaXMua3coYSl9LGt3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMubnF8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLnNwKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CnZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5raj1ifSkoYyk7dmFyIEw9Yy5ranx8Ckw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ249dGhpcy5hWzddO3RoaXMuSGs9dGhpcy5hWzhdO3RoaXMuRXQ9dGhpcy5hWzddO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMub3M9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbN119Yy5SaT1iO2IucHJvdG90eXBlPXtCbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ246dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkhrOnRoaXMuRHQoYSl9LER0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FdDp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubmo6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5SaXx8bGEseGM9bmV3IGxhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLkJuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuZ209TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5NYT17fTt0aGlzLkk9bnVsbDt0aGlzLkxjPTEwMDt0aGlzLkliPTA7dGhpcy5XYT0xNTA7dGhpcy5MYj0wO3RoaXMuRXUoYil9LGc6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhPyh0aGlzLkliKyssdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkxjKSk6MD50aGlzLldhJiYodGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkxjKSl9LHB1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWI+dGhpcy5XYT8hMDohMX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLkliPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKRXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuUCgpLCEwKTt0aGlzLk1hW2IubGEoKV09YjtNJiZNLmhoJiZNLmh2KGIpfSxOeDpmdW5jdGlvbigpe3JldHVybiBlLnllKHRoaXMuTWEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX0sWXI6ZnVuY3Rpb24oYil7Yj1iLkthKCk7Zm9yKHZhciBhIGluIHRoaXMuTWEpaWYoYi5pZD09dGhpcy5NYVthXS5LYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxleTpmdW5jdGlvbihiKXt0aGlzLk1hW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLmdtfHx0OyhmdW5jdGlvbihjKXtjLmltPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9CnRoaXMuaWQ9bnVsbDt0aGlzLkxjPTEwO3RoaXMuSWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubmE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkJiPSIiO3RoaXMucmc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5LYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxNOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30sT3U6ZnVuY3Rpb24oYil7dGhpcy5YPWJ9LE94OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sSHU6ZnVuY3Rpb24oYil7dGhpcy5QZT1ifSxNeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlfSxPZTpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2EmJih0aGlzLkliKyssCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTGMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sRmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sCmxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sZ3k6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMudHIoKXx8dGhpcy5pbygpO3RoaXMuRGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxQeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxpbzpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5hYSgxMCkpfSx0cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sVzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxLYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFZTpmdW5jdGlvbigpe3JldHVybiEwfSwKaXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFh4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmF9LGNhOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMH0sTWM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExoOmZ1bmN0aW9uKGIpe3RoaXMuQmI9Yn0sTHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPQpudWxsfSxSeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuQmImJihiPSEwKTtyZXR1cm4gYn0sYnk6ZnVuY3Rpb24oKXt0aGlzLnJnfHwodGhpcy5yZz0hMCl9LHZlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEl4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLmltfHxwOyhmdW5jdGlvbihjKXtjLnVpPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5JPXRoaXMucGxheWVyPSIiO3RoaXMuTWY9IjEiO3RoaXMuTmY9IjIiO3RoaXMuV249IjMiO3RoaXMuVGM9MDt0aGlzLm9oPTMwO3RoaXMuUmI9W107dGhpcy5oYj1bXTt0aGlzLnBjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLiRmPXRoaXMuZ2k9ITE7dGhpcy5zdGF0dXM9dGhpcy5UYzsKdGhpcy5pZD1lLmFhKDEwKTt0aGlzLmhmKGIpO3RoaXMuRnUoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5naXx8KHRoaXMuZ2k9ITAsZS5NZSgpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmJjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxOcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5rYSgpXXx8KHdpbmRvd1thLmthKCldPXt9KTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldfHwod2luZG93W2Eua2EoKV1bYi5sYSgpXT17fSx3aW5kb3dbYS5rYSgpXVtiLmxhKCldLmluaXRpYXRvcj1lLlpiKCkpO3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT93aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV0rKzp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV09MX0sVnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLAphPSEwLGg9bmV3IEo7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0uaW5pdGlhdG9yIT1lLlpiKCkmJih0aGlzLmpmKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMueGEoKSl7dGhpcy5OcigpO2lmKCF0aGlzLlZyKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmpmKCk7cmV0dXJufXRoaXMuamYoKTt0aGlzLkkodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLiRoKCk7dGhpcy4kZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSx1OmZ1bmN0aW9uKGIsYSl7dGhpcy54YSgpfHwodGhpcy5SYi5wdXNoKGIpLHRoaXMuaGIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5SYiYmMDx0aGlzLlJiLmxlbmd0aCYmKHRoaXMuUmI9CmUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaGIpe2Zvcih2YXIgaD0wO2g8dGhpcy5oYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5oYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5oYltoXS5yZWFzb25dPHRoaXMucGNbYl0mJihhPVtdLGEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksYj10aGlzLmhiW2hdLnJlYXNvbik7dGhpcy5wY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LFF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZ9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxqZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTmZ9LE11OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuV259LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTWZ9LHl4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk5mfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30saGY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxGdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0sWnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxCczpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMudWl8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3A9dGhpcy5hWzZdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuJGs9dGhpcy5hWzZdO3RoaXMuYng9dGhpcy5hWzEwXTt0aGlzLmlxPXRoaXMuYVs2XTsKdGhpcy5kaj10aGlzLmFbOV07dGhpcy5keD10aGlzLmFbOV07dGhpcy5Gcj10aGlzLmFbOF07dGhpcy5mcz10aGlzLmFbM107dGhpcy5Vbz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkdtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3A6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnByOnRoaXMuWmsoYSl9LFprOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy4kazp0aGlzLmF4KGEpfSxheDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYng6dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlxOnRoaXMuY2ooYSl9LGNqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZGo6dGhpcy5jeChhKX0sY3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR4OnRoaXMuRXIoYSl9LEVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gcjp0aGlzLmVzKGEpfSxlczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5mczp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLkdtfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ucCg0KTsoZnVuY3Rpb24oYyl7Yy5Haj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Hanx8b2E7KGZ1bmN0aW9uKGMpe2MuSGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLnp4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPwoodGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuSGp8fHBhOyhmdW5jdGlvbihjKXtjLklqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pOwp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Janx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNxPXRoaXMuYVs5XTt0aGlzLnVzPXRoaXMuYVsxMF07dGhpcy5KbT10aGlzLmFbMTBdO3RoaXMuTXI9dGhpcy5hWzEwXTt0aGlzLmJ3PXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMueWw9YjtiLnByb3RvdHlwZT17QnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNxOnRoaXMudHMoYSl9LHRzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51czp0aGlzLkltKGEpfSxJbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkptOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ncjp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy55bHx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQnEoNCk7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuTXA9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMueWt8fHNhOyhmdW5jdGlvbihjKXtjLnhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UYzt0aGlzLmlzUGxheWluZz10aGlzLlZjPSExO3RoaXMuYmU9MTt0aGlzLldjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlZjPSExO3RoaXMuYmU9MTt0aGlzLldjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5NcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueWQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlZjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5XYy5pbmRleE9mKGEpJiZ0aGlzLldjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuV2MubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LEJzOmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5WY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMueGt8fHRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuV3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5ZcihoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LEt4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFdxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy56a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sdj10aGlzLmFbNV07dGhpcy52aj10aGlzLmFbOV07dGhpcy5TdD10aGlzLmFbNF07dGhpcy5waz10aGlzLmFbMV07dGhpcy51dT10aGlzLmFbMl07dGhpcy5tcz10aGlzLmFbNV07dGhpcy5Caz10aGlzLmFbNF07dGhpcy5tcT10aGlzLmFbMV07dGhpcy51bT10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVszXX1jLndqPWI7Yi5wcm90b3R5cGU9e1F2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Sdjp0aGlzLnVqKGEpfSx1ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmo6dGhpcy5SdChhKX0sUnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlN0OnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wazp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1zOgp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQms6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1xOnRoaXMudG0oYSl9LHRtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMud2p8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlF2KDQpOyhmdW5jdGlvbihjKXtjLm1uPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSwKYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5tbnx8eGE7KGZ1bmN0aW9uKGMpe2MubG49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5GYz10aGlzLkNhPXRoaXMuJGM9ITE7dGhpcy5CaD1lLkhiKDEwKTt0aGlzLmZpPSEwO3RoaXMudWM9dGhpcy5XZz0hMTt0aGlzLlRzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5yaCgpLHRoaXMudnAoKSx0aGlzLnJiKCkpfSxUczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxjeTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkubGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi4kZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkouaWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5pZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkJoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFliOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSmc6ZnVuY3Rpb24oKXtpZighdGhpcy5GYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkZjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5GYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkZjfSxXcjpmdW5jdGlvbigpe2lmKCF0aGlzLlZnKXt2YXIgYj10aGlzLnliKCksYT10aGlzLlVyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5WZz0hMCl9cmV0dXJuIHRoaXMuVmd9LFVyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuJGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLiRjPSEwKTtyZXR1cm4gdGhpcy4kY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlliKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuaHUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksCjIwKX0saHU6ZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3ZhciBiPXRoaXMuSmcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnZjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApfSxKeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmIuYWRzJiYodGhpcy5vZz1iLmFkcyk7cmV0dXJuIHRoaXMub2d9LHZwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2EoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuSmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSw1MCkpfSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuV3IoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5ZYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5ZYigpLHRoaXMudWN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMueWIoKX1lbHNlIHRoaXMuV2c/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCksYj10aGlzLlliKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuV2c9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yaCgpfS5iaW5kKHRoaXMpLAo1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHdwOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud3AoKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5maT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5maSxmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sRHA6ZnVuY3Rpb24oKXt0aGlzLlN4fHwoMTA8dGhpcy53dz8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnd3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMub3UoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRHAoKX0uYmluZCh0aGlzKSwKNTApKSl9LG91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnh3KXt0aGlzLnh3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMubG58fHlhOyhmdW5jdGlvbihjKXtjLm5uPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS55ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpfX0pfSkoYyk7dmFyIHphPWMubm58fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbMTBdO3RoaXMuanA9dGhpcy5hWzRdO3RoaXMuU3I9dGhpcy5hWzZdO3RoaXMuWnM9dGhpcy5hWzVdOwp0aGlzLkFqPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs4XX1jLkx3PWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpwOnRoaXMuUnIoYSl9LFJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Tcjp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnM6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLkx3fHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9QmMuYW4oNCk7KGZ1bmN0aW9uKGMpe2MuWWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxLdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5iYyYmKDA8PWguaW5kZXhPZihkKXx8YS55ZCgpKX0sCnBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKToKd2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuWWx8fENhOyhmdW5jdGlvbihjKXtjLlhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9CjApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5EcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLkRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuS3QoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuWGx8fERhOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLlpsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanQ9dGhpcy5hWzNdO3RoaXMuU3M9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzhdO3RoaXMueHQ9dGhpcy5hWzhdO3RoaXMucmw9dGhpcy5hWzldO3RoaXMubGw9dGhpcy5hWzddO3RoaXMuSW89dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbM119Yy5icT1iO2IucHJvdG90eXBlPXtpdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanQ6dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNzOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wbDp0aGlzLnd0KGEpfSx3dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueHQ6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLmxsOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Jbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuYnF8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLml0KDQpOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkdnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMuTXQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD0KYi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5NdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmxkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5sZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubGQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxDcDpmdW5jdGlvbigpe2UuYmgodGhpcy5sZCk7CmUuRmUodGhpcy5sZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy52a3x8SGE7KGZ1bmN0aW9uKGMpe2MudWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMudWt8fElhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkdnKGIsImVsZW1lbnRJRCIpO2lmKGUuYmgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9ZWxzZSB0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLndrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuQWw9dGhpcy5hWzFdO3RoaXMuSXI9dGhpcy5hWzNdO3RoaXMueHU9dGhpcy5hWzRdO3RoaXMuRHI9dGhpcy5hWzZdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueW49dGhpcy5hWzddO3RoaXMuTW89dGhpcy5hWzVdO3RoaXMuWWs9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzVdfWMueGk9YjtiLnByb3RvdHlwZT17cXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ0OnRoaXMuemwoYSl9LHpsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWw6dGhpcy5IcihhKX0sSHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Jcjp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueHU6dGhpcy5DcihhKX0sQ3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkRyOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLnhuKGEpfSx4bjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW46dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1vOnRoaXMuWGsoYSl9LFhrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMueGl8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnF0KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9CmE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sR3U6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxqbzpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLlhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9bmV3IHooYSkpO3ZhciBjPXRoaXMuZ2I9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTsKaWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5PZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuR3UoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLllqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9CiIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5nYi5zZW5kKGEpfWNhdGNoKGYpe20mJm0uSWUodGhpcy4kYS51cmwpP20uT2Q/bS5pYSgicmVxdWVzdF9mYWlsZWQiKToKZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuWWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17S3U6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxKdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17aXg6IkFkQ2xpY2tUaHJ1IixreDoiQWRFcnJvciIsbHg6IkFkU3RvcHBlZCIsb3g6IkFkTGluZWFyQ2hhbmdlIixweDoiQWRUYWdQYXJzZWQiLHN4OiJBZFZpZGVvQ29tcGxldGUiLAp2eDoiQWRMb2FkZWQiLHd4OiJBZFNraXBwZWQiLHh4OiJBZFN0YXJ0ZWQiLG14OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsbng6IkFkSW1wcmVzc2lvbiIsang6IkFkQ3JlYXRpdmVWaWV3IixxeDoiQWRWaWRlb01pZHBvaW50IixyeDoiQWRQYXVzZWQiLHR4OiJBZFZpZGVvU3RhcnQiLHV4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LGx1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5IYSYmdGhpcy5IYS5WZClmb3IodmFyIGIgaW4gdGhpcy5IYS5WZCl0aGlzLkhhLlZkLmhhc093blByb3BlcnR5KGIpJiYKYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMubXUoKTt0aGlzLkhhJiZ0aGlzLmx1KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuV3A9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9IiI7dGhpcy5laD0hMTt0aGlzLndhPXRoaXMucWQ9IiI7dGhpcy4kZz10aGlzLlY9dGhpcy5pc0VuYWJsZWQ9dGhpcy5hZj0hMTt0aGlzLnBhPVtdO3RoaXMuUGc9dGhpcy5nYz0iIjt0aGlzLnJlPSExO3RoaXMuc2Y9MDt0aGlzLkhmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiOwp0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuS2Q9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5FcD10aGlzLlFkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9dGhpcy53Zj10aGlzLk9kPXRoaXMubGU9dGhpcy5VYz0hMTt0aGlzLmliPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnJkPTA7dGhpcy5SZz0hMTt0aGlzLlFnPTFFMzt0aGlzLmJkPSExO3RoaXMuUWE9MUUzO3RoaXMuUGY9IiJ9Yy5aaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5XcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnFkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZyxzZXJ2ZXI6dGhpcy5wYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlBnLGRpc2FibGVDb29raWVUZXN0OnRoaXMucmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuc2YsSE9NQURfVkVSSUZJRUQ6dGhpcy5IZixIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsCkhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuS2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkVwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk9kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaWIsc2l0ZUNvbmZpZzp0aGlzLkZhLHNlcnZlcklkOnRoaXMuS2gsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmtiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5OaCx2bWFwczp0aGlzLmxpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5iZCxhZEZhbGxiYWNrVVJMOnRoaXMuUGZ9fSwKcnI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxYcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsCmRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmFwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy54Y3x8dGhpcy53Ynx8dGhpcy53Y3x8dGhpcy5qZSkmJihnPXRoaXMuSXMoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ZcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Cmc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LEdjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnBhJiZ0aGlzLnBhLmxlbmd0aCYmMDx0aGlzLnBhLmxlbmd0aCYmKGI9dGhpcy5wYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9CmIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuRXg7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhW3RoaXMuS2hdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxiPXRoaXMuTWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsCmIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEhzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sQz0wO0M8Zy5sZW5ndGg7QysrKXt2YXIgaz1nW0NdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMucGgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj0KdGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LElzOmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkhzKGEsdGhpcy53YykpO3JldHVybiBhfSxCcDpmdW5jdGlvbigpe3RoaXMuRmEmJnRoaXMuRmEuY2xpZW50QVBJcyYmdGhpcy54cCh0aGlzLkZhLmNsaWVudEFQSXMpfSx4cDpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuS3UoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkp1KGEucGxheWVyKTtiLmcoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLAplKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlFkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5CcCgpO3RoaXMueHMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy52cygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSx4czpmdW5jdGlvbigpe3RoaXMuRGEobmV3IHoodGhpcy5xZCt0aGlzLmdlKCJnbG9iYWwiKSksCnRoaXMubHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sdnM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5GYSYmdGhpcy5GYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuRmEmJnRoaXMuRmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxpYTpmdW5jdGlvbihhKXtpZighdGhpcy5sZSl7dGhpcy5sZT0hMDsKdmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiYKYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpO3RoaXMuTmIoKTtlLkNjKGsuQ3QpOyhiPWUuJGIodGhpcy5zZCgpKSl8fChiPWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGxyOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPQp7fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy53YX1lbHNlIGE9dGhpcy53YTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGEuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLnBhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09CnRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuS2g9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMucGEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5nYyYmdGhpcy5MYSYmdGhpcy5wYS5sZW5ndGg/dGhpcy5IYyghMSk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPQohMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTt0aGlzLkRhKGIsdGhpcy5rdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY3VzdG9tZXIiKTthP3RoaXMuRG0/dGhpcy5pYSgibm9TVk1Db25maWciKToodGhpcy5EbT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGMoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxrdjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5PZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5pYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmtjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuS2Q9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnhjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMud2I9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuY2Q9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYmQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5lcihiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMucmUmJih0aGlzLmhjPW51bGwpO3RoaXMudGY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuSHYoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuS2QpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy5ydigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnN2KCkpfX0scnY6ZnVuY3Rpb24oKXt0aGlzLnF2KCk7dGhpcy50digpfSx0djpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmEoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5rZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuVmEoKSl7aWYodGhpcy5GYSYmdGhpcy5GYS5wbGF5ZXImJnRoaXMuRmEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7CnJldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxzdjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5VYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSxxdjpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUua2QoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmljKTsKYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy53dihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlBjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5LZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sd3Y6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMueHYoYywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSx4djpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1jO2sub25lcnJvcj1lO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy5wdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHB2OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5UaCgpOnRoaXMucWYoIkFBQSIpfSxUaDpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpOwp0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVWMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuSGYpKTt0aGlzLlFkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuUWQmJnRoaXMuUWQoKX0sQXA6ZnVuY3Rpb24oKXtpZih0aGlzLndmJiYKdGhpcy5ycigpKXt2YXIgYT10aGlzLlhxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnJkfHwodGhpcy5yZD0wKTt0aGlzLnJkKys7dGhpcy5yZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2MmJihhLm9pPSEwKTtxJiZlLlpyKCkmJihhLkJnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSx5cDpmdW5jdGlvbigpe2UuVmEoKXx8ZS5iYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuR2MoKXx8KGE9dGhpcy56YShjKSxjPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7Zy5uZXR3b3JrU3RhdGU9PQpnLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxudjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5saX0senA6ZnVuY3Rpb24oKXt0aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMuaHcuYmluZCh0aGlzKSx0aGlzLmd3LmJpbmQodGhpcykpfSxodzpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuQXEoKX0sZ3c6ZnVuY3Rpb24oKXt9LEFxOmZ1bmN0aW9uKCl7ZS5DYyhrLnpxKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmlhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxuZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuSmIubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxIdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxlcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPQphLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLlpqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5mcD10aGlzLmFbMl07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaGo9CnRoaXMuYVsxXTt0aGlzLmh0PXRoaXMuYVs4XTt0aGlzLmhzPXRoaXMuYVs1XTt0aGlzLlhtPXRoaXMuYVs3XTt0aGlzLlZ2PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzhdfWMuT2w9YjtiLnByb3RvdHlwZT17ZXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZwOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tbzp0aGlzLmdqKGEpfSxnajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaGo6dGhpcy5ndChhKX0sZ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmh0OnRoaXMuZ3MoYSl9LGdzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oczp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWG06dGhpcy5VdihhKX0sVXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5PbHx8UGEsRWM9bmV3IFBhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmVwKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy4kdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy5hZD0hMTt0aGlzLlhvPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307ZS5wYigibmV3QmlnQWRJZCIpO3RoaXMua3A9ZS5hYSgxMCk7dGhpcy5tZj0wO3RoaXMuWmM9IldlcmJ1bmcgLSBbdGltZV0iOwpjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWmM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWmM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMucG89Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkdkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5iYz0hMTt0aGlzLk9wPWUuYWEoMTApO3RoaXMuR2I9ZS5hYSgxMCk7dGhpcy5FYj1lLmFhKDEwKTt0aGlzLk9oPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLlJkPXRoaXMuT2I9dGhpcy5wZT10aGlzLmdkPXRoaXMuSWQ9CnRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubWQ9dGhpcy5Ldj10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLnhkPXt9fWMuVGo9YjtiLnByb3RvdHlwZT17QnU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLmR2KCk7ZS52KGsuZm8sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTGU6ZnVuY3Rpb24oYSxiLGMsZil7dGhpcy51Yj1jO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5BcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLG5ldyBTKHRoaXMsYSx0aGlzLm1oLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLm1jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5RYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLApjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUmQ9dGhpcy5PYj10aGlzLm1kPSExO3RoaXMuYz1hO3RoaXMuUHUodGhpcy5jKTt0aGlzLnhkPW5ldyBRYSh0aGlzLmMubncsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5IcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5IZD10aGlzLmhyKGEpKSx0aGlzLk1nKGEucGFyZW50KSl9LERnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YKYnx8KGM9dGhpcy5EZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLlNxKGEpKSk7cmV0dXJuIGN9LFNxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxocjpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxnPSIiO2lmKGEuVSl7Yj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEubGIoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpnfX0sc2E6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBiPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLmpkJiZhLmpkLmVycm9yJiZhLmpkLmVycm9yLmNvZGUmJihiPWEuamQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PQpHLlhkLmNvZGU/ZS52KGsuS3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5NZSgpLGI9PUcuS2YuY29kZSYmZS52KGsuVXMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk7ZS52KGsueXEsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmV2KCk7dGhpcy5YYSgiZW1wdHkiKTticmVhaztjYXNlIHcuSWYuY29kZTplLnYoay5pdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LkxmLmNvZGU6ZS52KGsuT3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuWWQuY29kZTplLnYoay5Qdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6ZS52KGsuVnMsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLmV3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5FZi5jb2RlOmUudihrLmZ3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLlhiKGEpO3RoaXMuUmEoKX0sWGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5LZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sUHU6ZnVuY3Rpb24oYSl7dGhpcy5wZT0hMTt0aGlzLlBiPQp0aGlzLmIuSzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5QYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuJGU9ITB9Y2F0Y2goZil7fX1jYXRjaChlKXt9Yi5keT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsCnRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTt0aGlzLnBvJiZ0aGlzLnBsYXllci52ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuTy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5PW2NdLnR5cGUpJiZ0aGlzLmtvKGIsYS5PW2NdLnVybCsiIixhLk9bY10udHlwZSk7dGhpcy4kZSYmYi5sb2FkKCk7aWYodGhpcy5YaChiKSl7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5ubyhiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7CnRyeXt0aGlzLiRlP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2goayl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5LcCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuTnUoKSk6dGhpcy5jLm9yaWdpbi51Zyh3LlVkKX0sTnU6ZnVuY3Rpb24oKXt0aGlzLkNmPSEwO3RoaXMuc2I9dGhpcy5uYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLm1nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5zYj0hMCk7ZS5vZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmCmUub28odGhpcy5jLm9yaWdpbi52YSk7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9RS5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi53aCgpO3RoaXMuYi5rZigpO2ZvcihhPXRoaXMuYi5LO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIua2YoKTt0aGlzLnRhPXRoaXMuUGI9dGhpcy5iLks7dGhpcy5oaSgidnBhaWQiKTtpZih0aGlzLnNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuS2IoIm11dGVkIiwiY29udGVudCIpO2UudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5LLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmtyKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmRnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5oZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJiF0aGlzLklkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay56YywKdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuYWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuc2M9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy55dyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnp3KCksdGhpcy5iLmFjKCEwKSwhdGhpcy5PYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy5ILApjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuR2UodGhpcy5PYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmFjKCEwKSx0aGlzLkR3KCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5IdygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5GdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkl3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkV3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm1pKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5WYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkwuYmR8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5RYyYmKHRoaXMuRGY9ITEsdGhpcy5mYygpKSx0aGlzLkJ3KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuc2I9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay52ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5zYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmhlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLmFnKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5ILCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sQXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLm5jPSEwfSxCdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlhjLHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubmM9ITF9LER3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sQ3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5RaCgpO2UudihrLlRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLlhjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubWQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlFmLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxHdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5WZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxJdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbWk6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7CmUub2UoKTt0aGlzLkg9ITE7dGhpcy5SYShhKX19LHl3OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5Kdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubWkoITApfSxrbzpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuR2MoKSl7dmFyIGQ9Yi56YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuc3cuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmMoYix0aGlzLkwpKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LG5vOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmlpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmppLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmppLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0saWk6ZnVuY3Rpb24oYSl7dGhpcy5XYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldifHx0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuWG8pKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWQmJnRoaXMuWGgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5XYil7dGhpcy5hZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5aYSgpLCEwKSx0aGlzLkwudGd8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLnB3KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIua2YoKTt0aGlzLm93KCk7dGhpcy5oaSgpO3RoaXMuZWcoKTt0aGlzLmIud2goKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMubmYoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nZHx8dGhpcy5SZigpfSxSZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmdkfHwoYT90aGlzLlJhKCk6KHRoaXMuUWUoITApLHRoaXMuUmYoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmVjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkxoKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuTC5rYiYmIXRoaXMuRmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5jbyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuUmEoKX0saG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9ITEsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9ZS5IZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQSgpKTtlLmJ2KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJgp0aGlzLmMuU2QmJnRoaXMuaG8odGhpcy5jLlNkKTtpZighdGhpcy5wZSlpZih0aGlzLnBlPSEwLHRoaXMuUmR8fChlLnYoay5Ycyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy50Ynx8dGhpcy5jLnFjKXtlLnBiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm1mKys7dGhpcy5XYj10aGlzLmFkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5HZD0hMTt0cnl7dGhpcy5iLmVpKCl9Y2F0Y2goZyl7fXRoaXMuSWQ9ITA7dGhpcy5iLkJlKCk7dGhpcy5iYz0hMTt0aGlzLnhlKCkuR2goKTt0aGlzLmMudGImJnRoaXMuYy5vcmlnaW4uUmUoKTt0aGlzLmMucWMmJihhP3RoaXMuYy5vcmlnaW4ucWgoKToKdGhpcy5xZSgpKX1lbHNlIHRoaXMucWUoKX0sc3c6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5XYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkwueXAoKTt0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxqaTpmdW5jdGlvbigpe2lmKHRoaXMuS3YpdGhpcy5SYSgpO2Vsc2V7dGhpcy5iYz0hMDt0aGlzLmIuZi5BYSYmIXRoaXMuSWQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dmFyIGE9Ck1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5OdihhKTtpZighdGhpcy5PYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5SZD0hMDtlLnYoay5raSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5sZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PaCkpJiYoYz10aGlzLmMubGYtCmEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy50Yj8odGhpcy5XYj10aGlzLmFkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5HZD0hMSx0aGlzLmIuZWkoKSx0aGlzLmMub3JpZ2luLlJlKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWmMucmVwbGFjZSgiW3RpbWVdIiwKZS5DZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmZlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxiaTpmdW5jdGlvbigpe3RoaXMudmh8fCh0aGlzLnZoPSEwLHRoaXMubWR8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxOdjpmdW5jdGlvbihhKXtlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuY2l8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYmkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5RaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLAp0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5rYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5UZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMubWQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLnYoay5RZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5jaT1hKX0sUGg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsYiwhMCl9LGR2OmZ1bmN0aW9uKCl7ZS5NZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxRaDpmdW5jdGlvbigpe2UuTWQoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0sZXY6ZnVuY3Rpb24oKXtlLk1kKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sClhhOmZ1bmN0aW9uKGEpe2UuTWQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuTC5rYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxLYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5rYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkZiKXt0aGlzLnhkJiZ0aGlzLnhkLnRyYWNrJiZ0aGlzLnhkLnRyYWNrKGEpO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLmlyKHRoaXMuYy5QYSxhKX1jYXRjaChmKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgZz1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmCih0aGlzLmtlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmUuWHIoZy51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZW8sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLktlKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmMuUGE9dGhpcy5VcCh0aGlzLmMuUGEsYSl9Y2F0Y2gobSl7fX19LFphOmZ1bmN0aW9uKCl7dmFyIGE9ZS5WYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixiPSIiO3RoaXMuQ2YmJihiPSJfdnBhaWQiKTt0aGlzLlFjJiYoYj0iX3dlbGVjdCIpO3JldHVybiBhK2J9LEtlOmZ1bmN0aW9uKGEsYixjLGYsZSl7YSYmInN0cmluZyI9PQp0eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxjJiZiLmpvKGMpLGZ8fChmPXRoaXMuc2cpLGV8fChlPXRoaXMuc2cpLHRoaXMubG8oYSksdGhpcy5MLkRhKGIsZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGxvOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09Im9wZW4ifSxGaDpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJjbG9zZWQifSxIcDpmdW5jdGlvbigpe3RoaXMuZGM9e319LGd2OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuZGMpdGhpcy5kYy5oYXNPd25Qcm9wZXJ0eShiKSYmIm9wZW4iPT10aGlzLmRjW2JdJiZhKys7cmV0dXJuIGF9LGlyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sVXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpifSl9LHB3OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5xdy5iaW5kKHRoaXMpKX0scXc6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmZjKCk6dGhpcy5jLlZiJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5MLmJkfHx0aGlzLlFjKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLlZifWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYy5WYixhKX19LmJpbmQodGhpcyksNTAwKSl9LApvdzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlpjLnJlcGxhY2UoIlt0aW1lXSIsZS5DZygwKSk7CnZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5jZCYmKGI9dGhpcy5MLmNkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5jZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sRWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5jZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGhpOmZ1bmN0aW9uKGEpe2lmKCFlLm9mKHRoaXMuY29udHJvbHMpKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpjLmlkPXRoaXMuT3A7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuR2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkViO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Ndi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkx2LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk9oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmMuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmxmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXt0aGlzLkJhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLm1nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGZjOmZ1bmN0aW9uKCl7dGhpcy5CYSYmImJsb2NrIj09dGhpcy5CYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxZaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuWGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxaaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMubmM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLm5jPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLm5jPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5YYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LEx2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxNdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuc2I/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5zYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMuc2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSwkdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmVjKTt0aGlzLmdkfHx0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0scWU6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUua2QoKTshdGhpcy5MLm1jfHxlLlZhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5rZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy50aHx8IXRoaXMuTC5VYyYmInNwaWVnZWwuZGUiIT1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwicHJlcm9sbCIhPWUuQ2I/KHRoaXMuZ2Q9ITAsdGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy5uZygpKToodGhpcy50aD10aGlzLlFjPXRoaXMuRGY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5rZT0hMCxhPWUuZGcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuTGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuZ3YoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy5JZD0hMCx0aGlzLmIuQmUoKSx0aGlzLmIucXUoKSx0aGlzLmJjPSExLAplLnYoay5OcCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMueGUoKS5HaCgpKX0seGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZWc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZS5GZSh0aGlzLnZpZGVvLGEpP3RoaXMuSWgoKTp0aGlzLnlkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVmIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5zYyYmMDx0aGlzLnNjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5zYykpO3RoaXMudmlkZW8mJgp0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMua3ArIi0iK3RoaXMubWY7dGhpcy5jJiZ0aGlzLmMuSWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLklnKCkpO3JldHVybiBhfSxzZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuVGp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRwPXRoaXMuYVsyXTt0aGlzLm50PXRoaXMuYVs4XTt0aGlzLll3PXRoaXMuYVsxXTt0aGlzLm5rPXRoaXMuYVsxMF07dGhpcy5raz10aGlzLmFbNV07dGhpcy5Vbj10aGlzLmFbNV07dGhpcy5Bbj10aGlzLmFbNl07dGhpcy5lbj10aGlzLmFbMV07dGhpcy52cj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLkJpPWI7Yi5wcm90b3R5cGU9CntTcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVHA6dGhpcy5tdChhKX0sbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm50OnRoaXMuWHcoYSl9LFh3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Zdzp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubms6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmtrOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Vbjp0aGlzLnpuKGEpfSx6bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQW46dGhpcy5kbihhKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVuOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuQml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5TcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkdhPW51bGw7dGhpcy5ZPVtdO3RoaXMuVT1udWxsO3RoaXMucmM9dGhpcy50Yz0hMTt0aGlzLnZhPSIiO3RoaXMuQmY9ITE7dGhpcy5UZz0iIjtkJiZkLmVtcHR5P3RoaXMuQXMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5rbj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5rZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPQohMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bS55YShtLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVmEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlKXthPWUucGcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uSmQoYSkpKyImdHlwZT1qcyIsYj1tLnlhKG0uSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0ueWEobS5KZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnpzLmJpbmQodGhpcyksdGhpcy53cy5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkdhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5DYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuQ2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkNifHx0aGlzLmJzKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLm52KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGJzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0senM6ZnVuY3Rpb24oYSl7dGhpcy5adChhKTt0cnl7dGhpcy5HYT1hLnJlc3BvbnNlWE1MLHRoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOgpHLkpmfSkpfSxBczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWWQpKX10aGlzLlk9dGhpcy5FZygpO3RoaXMudGM9dGhpcy5yZigpO3RoaXMucmM9dGhpcy5VaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5KYygpOnRoaXMuc2EodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkJmP0cuWGQ6Ry5KZn0pKX0sd3M6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5JZix7ZGVwdGg6YX0pKX0sSmM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5kcygpP3RoaXMueXYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMuUnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMuY3coKSYmdGhpcy5XZSh0aGlzLlJwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPwoodGhpcy50Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5SZSgpfSxxaDpmdW5jdGlvbigpe3RoaXMucmM/KHRoaXMucmM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSmMoKSk6dGhpcy5wYXJlbnQucWgoKX0sY3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52digpP3RoaXMudXYoKT8hMDooLTEhPXRoaXMuRGMoKT90aGlzLnNhKHRoaXMuU2Eody5UZCkpOnRoaXMuc2EodGhpcy5TYSh3LkVmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5TYyxHLktmKSksITEpfSxXZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5TZHx8KGEuU2Q9W10pO2EuU2QucHVzaCh0aGlzLlRnKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuQWc7dGhpcy5wYXJlbnQuV2UoYSl9LFJwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuRGMoKTthLk89dGhpcy5LZygpO2EuVmI9dGhpcy5UcSgpO2Eubnc9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5RcSgpO2EubGY9dGhpcy5ncihhLmR1cmF0aW9uKTthLmFiPWEuYWI/YS5hYjotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuQWc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLmFiPWIuYWI/Yi5hYjotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuQWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlVxKCkpOmIuUGEuY29uY2F0KHRoaXMuYnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5YYiYmdGhpcy5wYXJlbnQuWGIoYiksYT0wLHRoaXMuSmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxYYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5YYihhKX0sdWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30seXY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSx2djpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuS2coKS5sZW5ndGh9LHV2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSxVaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxadDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuQmY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sZHM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk5nKCkubGVuZ3RofSxOZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LFJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5sYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuYWgoYS5wYXJlbnROb2RlKTohMX0sYnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sVXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFRxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxGeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5wZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxncjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLmF2KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5wZChhKToiIn0scGQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLmtufHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp2PXRoaXMuYVs1XTt0aGlzLm5tPXRoaXMuYVsxXTt0aGlzLmlsPXRoaXMuYVs4XTt0aGlzLnhsPXRoaXMuYVs3XTt0aGlzLlJ3PXRoaXMuYVsxMF07dGhpcy5ObD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLlBxPWI7Yi5wcm90b3R5cGU9e0l2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kdjp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlsOnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54bDoKdGhpcy5RdyhhKX0sUXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJ3OnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlBxfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Jdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5mbT1iO2IucHJvdG90eXBlPXtLcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSwkcTpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy4kcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sa3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmZtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5UaT10aGlzLmFbOF07dGhpcy5Paz10aGlzLmFbOV07dGhpcy5lbT0KdGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzZdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuZ2s9dGhpcy5hWzRdO3RoaXMuenQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5adj1iO2IucHJvdG90eXBlPXtTaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVGk6dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk9rOnRoaXMuZG0oYSl9LGRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbTp0aGlzLkN2KGEpfSxDdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHY6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nazp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlp2fHxXYSxIYz1uZXcgV2EoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuU2koNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApneDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGh4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlB2PXRoaXMuYVs4XTt0aGlzLlZtPXRoaXMuYVs3XTt0aGlzLkRvPXRoaXMuYVsxMF07dGhpcy5QaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLkV2PWI7Yi5wcm90b3R5cGU9e092OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qdjp0aGlzLlVtKGEpfSxVbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm06dGhpcy5DbyhhKX0sQ286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkRvOnRoaXMuT2koYSl9LE9pOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuRXZ8fFhhLEljPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk92KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj0KYTt0aGlzLmpkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuRmo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkZqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KaT10aGlzLmFbMV07dGhpcy5VdD10aGlzLmFbN107dGhpcy53aT10aGlzLmFbMV07dGhpcy5jbT10aGlzLmFbNl07dGhpcy5VdT10aGlzLmFbNl07dGhpcy5HbD10aGlzLmFbMTBdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuUHI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy54bT1iO2IucHJvdG90eXBlPXtJaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSmk6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdDp0aGlzLnZpKGEpfSx2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5ibShhKX0sYm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5jbTp0aGlzLlR1KGEpfSxUdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXU6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdsOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50azp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUHI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLnhtfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5JaSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSGg9YTt0aGlzLnZpZGVvPWI7dGhpcy5QZD1bXTt0aGlzLkVoPVtdO3RoaXMuU2U9W107dGhpcy5ydz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLmpsPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLiR4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm51LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmZ1LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwpsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuUGQucHVzaCh7c3JjOmMsZnJhbWU6ZyxCdDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5TZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlNlW2JdO2MudHlwZT09PWEmJmMudXAodGhpcy5WcShhKSl9fSxWcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpeTohMCxoeTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntXeDoidmlkZW8iLGt5OiJqc0N1c3RvbSIsbHk6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbXk6MSxHeDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LGpyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5QZC5sZW5ndGg7YisrKWlmKHRoaXMuUGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5QZFtiXS5CdDtyZXR1cm4iIn0sbnU6ZnVuY3Rpb24oYSxiKXt0aGlzLkVoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLmpyKGIpLHZlbmRvcjpifSk7CnRoaXMuY3YoKX0sZnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnJ3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSx1cDpiLGZ5OiExfSl9LGN2OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS4kcnx8KGEuWngoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmp5LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS4kcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5qbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmo9dGhpcy5hWzEwXTt0aGlzLm5sPXRoaXMuYVsxXTt0aGlzLlNrPQp0aGlzLmFbNV07dGhpcy5Ecz10aGlzLmFbNV07dGhpcy5ncT10aGlzLmFbMl07dGhpcy52bD10aGlzLmFbM107dGhpcy5zbT10aGlzLmFbMl07dGhpcy5DbT10aGlzLmFbM107dGhpcy5Tbj10aGlzLmFbNF07dGhpcy5Raz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLkdzPWI7Yi5wcm90b3R5cGU9e2FqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5iajp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmw6dGhpcy5SayhhKX0sUms6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNrOnRoaXMuQ3MoYSl9LENzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy51bChhKX0sdWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52bDp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNtOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuQ206dGhpcy5SbihhKX0sUm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNuOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Razp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuR3N8fFphLEtjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLmFqKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMuZj1hO3RoaXMuamI9YS5GZygpO3RoaXMuSz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLksuaWQ9ZS5hYSgxMCk7dGhpcy5GPUUucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5jZz0hMTt0aGlzLlRiPVtdfWMub2o9YjtiLnByb3RvdHlwZT17T3E6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5PcShhKTtmb3IodmFyIGI9MCxjPTAsZT0hMSxnPXRoaXMud3IoYSksaz17fTthOyliKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGp2OmZ1bmN0aW9uKCl7dGhpcy5jZz0hMH0sZWk6ZnVuY3Rpb24oKXt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LAp3aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLnpjLHRoaXMuZi5zKCkpfSxxdTpmdW5jdGlvbigpe3RoaXMuY2d8fCh0aGlzLmYucGxheSgpLGUudihrLmZkLHRoaXMuZi5zKCkpKX0sa2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuSy5zdHlsZS56SW5kZXg9YTt0aGlzLksuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5LLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLksuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLksuc3R5bGUuYm94U2l6aW5nPXRoaXMuamIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSy5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PXRoaXMuamIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5qYik7dGhpcy5mLk1jJiZ0aGlzLmYuTWMoKT90aGlzLmYuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5LKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSx3cjpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGImJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sSXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249CmIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sYWM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JcSh0aGlzLmpiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkJlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5NYygpPyh0aGlzLksuc3R5bGUubGVmdD0iMHB4Iix0aGlzLksuc3R5bGUudG9wPSIwcHgiKToodGhpcy5LLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5LLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5LLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KwoicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLm9mKHRoaXMuSykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGFnOmZ1bmN0aW9uKGEpe3RoaXMuVGJ8fCh0aGlzLlRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5UYi5wdXNoKGEpfSxCZTpmdW5jdGlvbigpe3RoaXMuSyYmdGhpcy5LLnBhcmVudE5vZGUmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkspO3RoaXMuRiYmdGhpcy5GLnBhdXNlJiZ0aGlzLkYucGF1c2UoKX19fSkoYyk7Zm9yKHZhciAkYT1jLm9qfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtFLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FbD10aGlzLmFbN107dGhpcy54cT10aGlzLmFbMV07dGhpcy55bz10aGlzLmFbMV07dGhpcy5MbD10aGlzLmFbNF07dGhpcy5ycT10aGlzLmFbM107dGhpcy5Odz10aGlzLmFbMl07dGhpcy5Hbz10aGlzLmFbMV07dGhpcy5haz10aGlzLmFbNF07dGhpcy51bj10aGlzLmFbNl07dGhpcy5qPQp0aGlzLmFbMl19Yy5ocD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWw6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhxOnRoaXMueG8oYSl9LHhvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55bzp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGw6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJxOnRoaXMuTXcoYSl9LE13OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Odzp0aGlzLkZvKGEpfSxGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR286dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFrOnRoaXMudG4oYSl9LHRuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJiPWMuaHB8fGJiLExjPQpuZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5EbCg0KTsoZnVuY3Rpb24oYyl7Yy5TbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5XKGEpO3RoaXMuRGQoYik7dGhpcy5xZygpfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0scWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkthKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLAphP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sRWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5LYSgpOwppZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLlNsfHxjYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuVWY9dGhpcy5XZj10aGlzLlhnPXRoaXMuZWE9dGhpcy51Zj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkVxKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51Zj0hMDt0aGlzLlhnJiZ0aGlzLmtnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsCiJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJmEuYmMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuWGc9ITA7dGhpcy5rZygpfS5iaW5kKHRoaXMpKTt0aGlzLmdnKCl9LGtnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Ipe3RoaXMuZGQoKTtpZighdGhpcy51ZiYmIXRoaXMuZGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnVmJiZ0aGlzLlVmJiYhdGhpcy5XZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGRkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpOwpyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sTGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sZ2c6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPXRoaXMuTGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5XZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlVmPWIuRHh9dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSxIeDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5VeCgpOiExfSxEYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkRjKCk6LTF9LGNyOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LEVxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlNifHwzMDI9PXRoaXMuU2I/dGhpcy5lYT0hMDp0aGlzLnUoImFkZXJyb3IiLHRoaXMuU2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOmIuRWUoKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5jcihiKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksCjJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy5SbHx8ZGI7KGZ1bmN0aW9uKGMpe2MuVGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxhczpmdW5jdGlvbigpe3dpbmRvdy5PTy5sbS5Ybi5Wbj93aW5kb3cuT08ubG0uWG4uVm4uQngoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYXMoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS55ZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgY2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IGRiKGMsCnRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy5UbHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ0PXRoaXMuYVs1XTt0aGlzLnZ3PXRoaXMuYVs4XTt0aGlzLllwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzhdfWMuYXE9YjtiLnByb3RvdHlwZT17YXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJ0OnRoaXMudXcoYSl9LHV3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52dzp0aGlzLlhwKGEpfSxYcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWXA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLmFxfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuYXQoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLnpoKCl9LHpoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ZaXx8aGI7KGZ1bmN0aW9uKGMpe2MuWGk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0saGc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucmEoKTp0aGlzLm0oKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuaGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sQ2g6ZnVuY3Rpb24oYil7Yj1uZXcgaGIoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fChiLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlIoYiksKG5ldyBpYihiLHRoaXMuSSkpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZxfHwodGhpcy5GcT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuQ2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkNoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7CnRoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuWml8fGpiLFQ9bmV3IGpiKHIpO1QuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZ3PXRoaXMuYVsxXTt0aGlzLlFsPXRoaXMuYVsxXTt0aGlzLnFzPXRoaXMuYVs2XTt0aGlzLkF2PXRoaXMuYVsxMF07dGhpcy5paz10aGlzLmFbMV07dGhpcy5ycD10aGlzLmFbOV07dGhpcy5idT10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLkFpPWI7Yi5wcm90b3R5cGU9e1V3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Wdzp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFsOnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xczp0aGlzLnp2KGEpfSx6djpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQXY6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5pazp0aGlzLnFwKGEpfSxxcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJwOnRoaXMuYXUoYSl9LGF1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5idTp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkFpfHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5Vdyg0KTsoZnVuY3Rpb24oYyl7Yy5ObT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuTm18fFU7KGZ1bmN0aW9uKGMpe2MuTW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guWWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlljKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuJHMoYSl9LmJpbmQodGhpcykpO3guWWMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5ZYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3gucXIoKX0sJHM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwKMzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLk1tfHxWOyhmdW5jdGlvbihjKXtjLk9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTsKdGhpcy53ZCYmKGI9ZS5WcChiLHRoaXMud2QpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLndkfHwodGhpcy53ZD1bXSksdGhpcy53ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWWM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8Cih0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LEJ2OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5wdSgpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxxcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9CmEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5CdihiKX19KX0pKGMpO3ZhciBsYj1jLk9tfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpuPXRoaXMuYVsxXTt0aGlzLldrPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMudHc9YjtiLnByb3RvdHlwZT17aG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuVmsoYSl9LFZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuV2s6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYj1jLnR3fHxtYixPYz1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy5obig0KTsoZnVuY3Rpb24oYyl7Yy5VaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxBYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuVWl8fG5iOyhmdW5jdGlvbihjKXtjLlZpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMudSgibm9BZCIsInBsYXllZCIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLlZpfHxvYjsoZnVuY3Rpb24oYyl7Yy5XaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpOwppZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBuYihkKTt0aGlzLk4oZyl8fCh0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLldpfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1wPXRoaXMuYVs1XTt0aGlzLmVxPXRoaXMuYVs3XTt0aGlzLkp0PXRoaXMuYVs0XTt0aGlzLlVrPXRoaXMuYVs2XTt0aGlzLmduPXRoaXMuYVs4XTt0aGlzLndtPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuUXU9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1wOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lcTp0aGlzLkl0KGEpfSxJdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSnQ6dGhpcy5UayhhKX0sVGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVrOnRoaXMuZm4oYSl9LGZuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbjp0aGlzLnZtKGEpfSx2bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj0KYy5RdXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMubHAoNCk7KGZ1bmN0aW9uKGMpe2MuSWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuZXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZXU6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJgphLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFlnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuSWx8fHNiOyhmdW5jdGlvbihjKXtjLkhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLkhsfHx0YjsoZnVuY3Rpb24oYyl7Yy5KbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9CmwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5KbHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZmo9dGhpcy5hWzddO3RoaXMuUHM9dGhpcy5hWzNdO3RoaXMuc3U9dGhpcy5hWzZdO3RoaXMuZng9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy5Hcj1iO2IucHJvdG90eXBlPXtlajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmo6dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBzOgp0aGlzLnJ1KGEpfSxydTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnN1OnRoaXMuZXgoYSl9LGV4OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5meDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuR3J8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmVqKDQpOyhmdW5jdGlvbihjKXtjLnFuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMucW58fAp3YjsoZnVuY3Rpb24oYyl7Yy5wbj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxZYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sY3U6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5jdSh0aGlzLkNhKToodGhpcy5DYT10aGlzLlliKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpO3JldHVybn1pZighdGhpcy51Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZiLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmZiW2FdJiYzMDMhPXRoaXMuZmJbYV0mJjQwMyE9dGhpcy5mYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKNTAwKX19KX0pKGMpO3ZhciB4Yj1jLnBufHx4YjsoZnVuY3Rpb24oYyl7Yy5ybj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMucm58fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MbT10aGlzLmFbMV07dGhpcy5HcD10aGlzLmFbMV07dGhpcy5SbT10aGlzLmFbOV07dGhpcy5Rbj10aGlzLmFbOV07CnRoaXMua3E9dGhpcy5hWzEwXTt0aGlzLnp1PXRoaXMuYVs2XTt0aGlzLnVvPXRoaXMuYVsyXTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzJdfWMuY249YjtiLnByb3RvdHlwZT17S206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxtOnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HcDp0aGlzLlFtKGEpfSxRbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUm06dGhpcy5QbihhKX0sUG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlFuOnRoaXMuanEoYSl9LGpxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcTp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuenU6dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVvOnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT8KdGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLmNufHxBYixSYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5LbSg0KTsoZnVuY3Rpb24oYyl7Yy56bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5YZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuTHQoKX0uYmluZCh0aGlzKSw1MDApfSxMdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJgphJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5YZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5YZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxmdjpmdW5jdGlvbigpe3RoaXMuWGU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBCYj1jLnptfHxCYjsoZnVuY3Rpb24oYyl7Yy55bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubGM9MH0sZzpmdW5jdGlvbigpe3RoaXMuRnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmxjfHwodGhpcy5sYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5sY3x8dGhpcy5sYysrLHRoaXMubGM8PXRoaXMuRnM/KHRoaXMubGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLmZ2KCksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBDYj1jLnltfHxDYjsoZnVuY3Rpb24oYyl7Yy5BbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgQ2IoYix0aGlzLkkpKS5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBEYj1jLkFtfHxEYixFYj1uZXcgRGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnE9dGhpcy5hWzZdO3RoaXMubHQ9dGhpcy5hWzNdO3RoaXMuSGk9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy50dD1iO2IucHJvdG90eXBlPXt1cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnE6dGhpcy5rdChhKX0sa3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmx0OnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLnR0fHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1TYy51cSg0KTsoZnVuY3Rpb24oYyl7Yy5wbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLnBtfHxHYjsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzsKYSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLkxwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMub2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnNzKCk6dGhpcy5qZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LExwOmZ1bmN0aW9uKCl7dGhpcy5TZigpfHx0aGlzLm0oITApfSxzczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm9kKCk7IWIucWEmJmIuWSYmYi5BeCYmYi5DeCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoKX0uYmluZCh0aGlzKSwxMDApfSxvZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVoKWZvcih2YXIgYj1sLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLmlkLApjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudWg9YltjXSk7cmV0dXJuIHRoaXMudWh9LFZ4OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLm9kKCkuYWRzTG9hZGVyP3RoaXMuRyghMCk6dGhpcy5HKCk6dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEhiPWMub218fEhiOyhmdW5jdGlvbihjKXtjLnFtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwucGxheWVyYXBpKXt2YXIgYj1sLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgSGIoYyx0aGlzLkkpKS5nKCkpfXJldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgSWI9Yy5xbXx8SWIsSmI9bmV3IEliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNqPXRoaXMuYVszXTt0aGlzLnduPXRoaXMuYVs0XTt0aGlzLlNqPXRoaXMuYVs1XTt0aGlzLktxPXRoaXMuYVs2XTt0aGlzLkRpPXRoaXMuYVs4XTt0aGlzLnNvPXRoaXMuYVs3XTt0aGlzLldvPXRoaXMuYVs2XTt0aGlzLnppPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzZdfWMucnM9YjtiLnByb3RvdHlwZT17Qmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNqOnRoaXMudm4oYSl9LHZuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud246dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNqOgp0aGlzLkpxKGEpfSxKcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS3E6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRpOnRoaXMucm8oYSl9LHJvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zbzp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV286dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56aTp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnJzfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5Caig0KTsoZnVuY3Rpb24oYyl7Yy5mbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxUeDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxNYzpmdW5jdGlvbigpe3JldHVybiEwfSxLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9CmMuZmx8fFg7KGZ1bmN0aW9uKGMpe2MuZGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlllJiZiIT10aGlzLlllfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLmF5KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuZGx8fFk7KGZ1bmN0aW9uKGMpe2MuZ2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5uYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuZ2x8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY2s9dGhpcy5hWzEwXTt0aGlzLiRwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuRW89YjtiLnByb3RvdHlwZT17Yms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmNrOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuRW98fE5iLFVjPW5ldyBOYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5iayg0KTsoZnVuY3Rpb24oYyl7Yy5Qaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LEF1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LApBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5Qanx8T2I7KGZ1bmN0aW9uKGMpe2MuT2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5Panx8UGI7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpOwp2YXIgUWI9Yy5Ranx8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs2XTt0aGlzLkZtPXRoaXMuYVsyXTt0aGlzLmNsPXRoaXMuYVsxXTt0aGlzLlN1PXRoaXMuYVs2XTt0aGlzLld0PXRoaXMuYVs0XTt0aGlzLldsPXRoaXMuYVs3XTt0aGlzLnZ0PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzZdfWMuRnQ9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRsOnRoaXMuRW0oYSl9LEVtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GbTp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5SdShhKX0sUnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlN1OnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV3Q6dGhpcy5WbChhKX0sClZsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbDp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLkZ0fHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Fbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSwKTmQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LGR1OmZ1bmN0aW9uKCl7dGhpcy5SYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJjfHwodGhpcy5SYz0hMCx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5OZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxBYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuRW58fFRiOyhmdW5jdGlvbihjKXtjLkRuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LERoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSwKYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VYihhKX0uYmluZCh0aGlzKSkpLGImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5EaC5iaW5kKHRoaXMpLDEwKX0sVWI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT0KYS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxPZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5VYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuT2YoKTt0aGlzLmd1KCl9LGd1OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGIpe3RoaXMuVWIoYil9KX0sbTpmdW5jdGlvbihiKXt0aGlzLiR0P3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihiKXt0aGlzLiR0PSEwO2lmKGImJmIuZGV0YWlsKWZvcih2YXIgYSBpbiBiLmRldGFpbCkiYWRUYWdVcmwiPT1hJiYoYi5kZXRhaWxbYV18fHRoaXMuVWIoYikpfX0pfSkoYyk7dmFyIFViPWMuRG58fFViOyhmdW5jdGlvbihjKXtjLkZuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIuZHUoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpOwp2YXIgVmI9Yy5Gbnx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLlluPWI7Yi5wcm90b3R5cGU9e2pzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLllufHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy5qcyg0KTsoZnVuY3Rpb24oYyl7Yy5abT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLnhoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT0KYi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLk5zPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxBdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTnN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy54aCYmCih0aGlzLnhoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy5abXx8TzsoZnVuY3Rpb24oYyl7Yy5ZbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuTXUoKTp0aGlzLm0oITApLCEwO3RoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubSgpOnRoaXMubSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnVlPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlM9CnRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLlltfHxQOyhmdW5jdGlvbihjKXtjLiRtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwKKHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuY2YoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLiRtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMucms9dGhpcy5hWzZdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy5Xdj1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSHQ6CnRoaXMucWsoYSl9LHFrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5yazp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Xdnx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuR3QoNCk7KGZ1bmN0aW9uKGMpe2MuSms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ka3x8WjsoZnVuY3Rpb24oYyl7Yy5Jaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5yYigpLCEwO3RoaXMuVWcrKztpZigxMDx0aGlzLlVnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0KITB9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLklrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Laz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLktrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY3A9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzldO3RoaXMuTm49dGhpcy5hWzZdO3RoaXMuS3I9dGhpcy5hWzVdO3RoaXMuSG49dGhpcy5hWzRdO3RoaXMucHE9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5saz1iO2IucHJvdG90eXBlPXticDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY3A6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5lazp0aGlzLk1uKGEpfSxNbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTm46dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktyOnRoaXMuR24oYSl9LEduOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Ibjp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLmxrfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5icCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJgphPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Nanx8ZGM7KGZ1bmN0aW9uKGMpe2MuTGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaWcoKX0saWc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLkxqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Oaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLk5qfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHQ9dGhpcy5hWzldO3RoaXMucmo9dGhpcy5hWzZdO3RoaXMuQnI9dGhpcy5hWzNdO3RoaXMuS3M9dGhpcy5hWzNdO3RoaXMuV3U9dGhpcy5hWzEwXTt0aGlzLkpuPXRoaXMuYVs1XTt0aGlzLnB0PXRoaXMuYVs2XTsKdGhpcy5qPXRoaXMuYVsxMF19Yy5zdD1iO2IucHJvdG90eXBlPXtjdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZHQ6dGhpcy5xaihhKX0scWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnJqOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ccjp0aGlzLkpzKGEpfSxKczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3M6dGhpcy5WdShhKX0sVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLld1OnRoaXMuSW4oYSl9LEluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kbjp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucHQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLnN0fHxoYyxaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9WmMuY3QoNCk7KGZ1bmN0aW9uKGMpe2Mucmk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMucml8fGljOyhmdW5jdGlvbihjKXtjLnBpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGZnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5mZy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnBpfHxqYzsoZnVuY3Rpb24oYyl7Yy5zaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9Cm5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnNpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQW89dGhpcy5hWzJdO3RoaXMuRWo9dGhpcy5hWzRdO3RoaXMuQ2w9dGhpcy5hWzhdO3RoaXMuVG09dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzddO3RoaXMuaj0KdGhpcy5hWzNdfWMuUXM9YjtiLnByb3RvdHlwZT17em86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkFvOnRoaXMuRGooYSl9LERqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fajp0aGlzLkJsKGEpfSxCbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2w6dGhpcy5TbShhKX0sU206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRtOnRoaXMuSm8oYSl9LEpvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMuUXN8fG1jLCRjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLnpvKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdOwp0aGlzLmJmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj8KbnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcWI/bnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLmhtPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuZHIoYSk6W10sYjt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107CnRoaXMueGYoYikmJih0aGlzLnpkLnB1c2goYiksdGhpcy5KaChiKSl9fSx4ZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmJmW2NdLHRoaXMueGYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5nKCl9LGh2OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG5jPWMuaG18fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5RcD10aGlzLmFbMV07dGhpcy5Gaz10aGlzLmFbN107dGhpcy5NcT10aGlzLmFbMTBdO3RoaXMuTXM9dGhpcy5hWzddO3RoaXMuWXU9dGhpcy5hWzZdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMueWo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5ncD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUXA6dGhpcy5FayhhKX0sRWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZrOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5NcTp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTXM6dGhpcy5YdShhKX0sWHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLll1OnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cjp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5ncHx8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9YWQuUHAoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQ2Moay5kdyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywKITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkNjKGsuV3MpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgYmQ9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLlpnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWmcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTsKSS5rYSgpO3ZhciBjZD1iZChmdW5jdGlvbigpe2Uuemcod2luZG93LEkuUXIoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhxPXRoaXMuYVs3XTt0aGlzLll2PXRoaXMuYVs0XTt0aGlzLmJvPXRoaXMuYVszXTt0aGlzLm5yPXRoaXMuYVs3XTt0aGlzLmpqPXRoaXMuYVs0XTt0aGlzLlFvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMuQm89YjtiLnByb3RvdHlwZT17R3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYm86dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5yOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuamo6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5Cb3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuR3EoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnloPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy51ZD0wO3RoaXMuZWI9IiI7dGhpcy5BZD1bXTt0aGlzLkJkPTA7dGhpcy5BaD0hMTt0aGlzLlplPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnRpPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3RoaXMueWg9YX0saGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKRHU6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSxOYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5iYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLlRyKCkpdGhpcy5uYi5sKHRoaXMubmIucWQsCnRoaXMubmIud2EsdGhpcy5uYi5hZixmdW5jdGlvbigpe3RoaXMuTmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLkJjKTtlbHNlIGlmKHRoaXMuc3IoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmp2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm5iLGcpO2wuQnUodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkVzKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJgooYz10aGlzLnBsYXllci5KZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5MZShhLGMsZik7dGhpcy5wbGF5ZXIuTGgobCl9fSxUcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnVkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yj8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LCR1OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UuZ2YoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX0sWnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueWgpe2UuZ2YoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLkl1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnZnKGMpKT90aGlzLk5jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LGp1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuT3UodGhpcy5adS5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuTmEoKX0sRmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZ2YoIm1pZHJvbGwiKTtpZighdGhpcy5uaCl7dGhpcy5uaD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5OYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX19LGl1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHUodGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy4kdSgpO3RoaXMucGxheWVyLk9lJiZ0aGlzLml1KCk7dGhpcy5qdSgpfSxrdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5BZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuV3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxzcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSx2dTpmdW5jdGlvbihhKXt0aGlzLkFoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuUHQuYmluZCh0aGlzKSl9LFB0OmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLlplLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy5BaCgpfSxFczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5aZS5sZW5ndGg7YysrKWI9CnRoaXMuWmVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubXY9dGhpcy5hWzRdO3RoaXMuS2o9dGhpcy5hWzNdO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnRxPXRoaXMuYVs1XTt0aGlzLlR3PXRoaXMuYVszXTt0aGlzLmZ0PXRoaXMuYVs4XTt0aGlzLlR2PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzldfWMuUG09YjtiLnByb3RvdHlwZT17bHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm12OnRoaXMuSmooYSl9LEpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2o6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMuc3EoYSl9LHNxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6CnRoaXMuU3coYSl9LFN3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udzp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZnQ6dGhpcy5TdihhKX0sU3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Udjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuUG18fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLmx2KDQpfSkuY2FsbChhdUZlZXNodWVlWWFpeW9vLGF1RmVlc2h1ZWVZYWl5b28pOwo=
- 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 A108
|
241 B
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
89ms
89ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20gdpr-cmp-teads-response%20106.32
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ad
Show response
a.teads.tv/page/68592/
|
118 B
332 B
|
62ms
62ms
|
XHR
application/json |
2.18.232.7
Akamai Technologies
|
|
General
- Full URL
- https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A73584%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22native%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=f4b0ea10-d272-4741-b455-c4cbc0624bea&formatVersion=2.22.61&env=js-web&netBw=10&ttfb=103
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
90ms
90ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20gdpr-cmp-teads-response%2096.01
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ad
Show response
a.teads.tv/page/68592/
|
118 B
332 B
|
63ms
63ms
|
XHR
application/json |
2.18.232.7
Akamai Technologies
|
|
General
- Full URL
- https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A76332%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22multislot%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=f4b0ea10-d272-4741-b455-c4cbc0624bea&formatVersion=2.22.61&env=js-web&netBw=10&ttfb=103
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
262ms
262ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20gdpr-cmp-teads-response%20108.88
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
258ms
257ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20gdpr-cmp-teads-response%2097.63
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.giga.de/ffd035648cc92a2c279da5376be630b486af541c/
Frame E2F6
|
109 B
671 B
|
54ms
5ms
|
XHR
application/json |
5.9.139.135
HETZNER-AS
|
|
General
- Full URL
- https://ssl.2.damoh.giga.de/ffd035648cc92a2c279da5376be630b486af541c/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGF1RmVlc2h1ZWVZYWl5b289YXVGZWVzaHVlZVlhaXlvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5wcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5EdShtKTthLkN1KGwpO2Eua3UoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5MdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXQ9dGhpcy5hWzVdO3RoaXMuTG49dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLnFvPWI7Yi5wcm90b3R5cGU9e1h0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZdDp0aGlzLktuKGEpfSxLbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTG46dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndvOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5GaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMucW98fGhhLHNjPQpuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5YdCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5wcD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuT3QuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5Waj1iO2IucHJvdG90eXBlPXtpdjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTsKdGhpcy5vYlthXSs9MTs1PHRoaXMub2JbYV0mJiF0aGlzLlNnW2FdJiYodGhpcy5TZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLml2KCksITApKX0sb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sb286ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSwKe3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxPdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5OdChhLmRhdGEpfSxOdDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9CkpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sSGc6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbW86ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLk5xKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PQpiLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LE5xOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxjczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9CmFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sb2Y6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOgohMTohMX0sRmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3E9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmUoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYKMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09CnR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eT1rO3U9bTtyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHEsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChxLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7Cm09bSt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihtKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxxPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sWnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxrZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17UWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sJGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCnhyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LHNuOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxhbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LEhtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sWW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5RaSgpfHxhLiRpKCl8fGEueHIoKXx8YS5VbCgpfHxhLnNuKCl8fGEuYWwoKXx8YS5IbSgpfX07cmV0dXJuIG51bGwhPWEuWW8oKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpOwp2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxmcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sVnA6ZnVuY3Rpb24oYSwKYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LGF2OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj0KYX0semc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5DYjt0aGlzLmVlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sUXQ6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJgoxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5mcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGJ2OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9CnRoaXMuWmIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmVlKGEpfSxlZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlF0KGEpO2lmKGIpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKGIpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTWQ6ZnVuY3Rpb24oYSl7aWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLnpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuY3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8CnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMueGcoYSkpcmV0dXJuIHRoaXMueGcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSwKZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnNkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLm1vKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIGw9ZXx8bTtlPSEwO2smJihlPSExKTtpZihsJiZsLlYpaWYobC5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLApjLGwsZyxrKX0uYmluZCh0aGlzKSw1MDApfSxraDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5czpmdW5jdGlvbihhLApiLGQpe3RoaXMua2goYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuT2MpZm9yKHZhciBjIGluIHRoaXMuT2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5PY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5iYihhLGYuTGEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnlzKGYuc2QoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEx1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LFd3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIiwKZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxhcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sWHI6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0KMDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLlZqfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlVqPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuQ3Q9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuS3c9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi55cT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLllmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlFmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuY289e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07CmIuaXc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlVzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnpxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Pdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLk5wPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5mZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTsKYi56Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuWGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLmZvPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5YYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLmVvPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTsKYi5Ycz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnZkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuSnc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZXc9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmZ3PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Xcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5Vanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs2XX1jLnBqPWI7Yi5wcm90b3R5cGU9e0Z2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIGphPWMucGp8fGphLHZjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Gdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLldqPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxsYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sYXI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrCm5hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG5kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5uZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm5kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sa2E6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLmxhKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm5kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxRcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuYXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5uZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9Yy5Xanx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50cD10aGlzLmFbNV07dGhpcy5rbT10aGlzLmFbOF07dGhpcy4kbz10aGlzLmFbN107dGhpcy5OaT10aGlzLmFbOF07dGhpcy4kdz10aGlzLmFbMV07dGhpcy5sdz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs3XX0KYy5ucT1iO2IucHJvdG90eXBlPXtzcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudHA6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmttOnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbzp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmk6dGhpcy5adyhhKX0sWnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR3OnRoaXMua3coYSl9LGt3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMubnF8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLnNwKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CnZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5raj1ifSkoYyk7dmFyIEw9Yy5ranx8Ckw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ249dGhpcy5hWzddO3RoaXMuSGs9dGhpcy5hWzhdO3RoaXMuRXQ9dGhpcy5hWzddO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMub3M9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbN119Yy5SaT1iO2IucHJvdG90eXBlPXtCbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ246dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkhrOnRoaXMuRHQoYSl9LER0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FdDp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubmo6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5SaXx8bGEseGM9bmV3IGxhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLkJuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuZ209TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5NYT17fTt0aGlzLkk9bnVsbDt0aGlzLkxjPTEwMDt0aGlzLkliPTA7dGhpcy5XYT0xNTA7dGhpcy5MYj0wO3RoaXMuRXUoYil9LGc6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhPyh0aGlzLkliKyssdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkxjKSk6MD50aGlzLldhJiYodGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkxjKSl9LHB1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWI+dGhpcy5XYT8hMDohMX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLkliPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKRXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuUCgpLCEwKTt0aGlzLk1hW2IubGEoKV09YjtNJiZNLmhoJiZNLmh2KGIpfSxOeDpmdW5jdGlvbigpe3JldHVybiBlLnllKHRoaXMuTWEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX0sWXI6ZnVuY3Rpb24oYil7Yj1iLkthKCk7Zm9yKHZhciBhIGluIHRoaXMuTWEpaWYoYi5pZD09dGhpcy5NYVthXS5LYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxleTpmdW5jdGlvbihiKXt0aGlzLk1hW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLmdtfHx0OyhmdW5jdGlvbihjKXtjLmltPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9CnRoaXMuaWQ9bnVsbDt0aGlzLkxjPTEwO3RoaXMuSWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubmE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkJiPSIiO3RoaXMucmc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5LYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxNOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30sT3U6ZnVuY3Rpb24oYil7dGhpcy5YPWJ9LE94OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sSHU6ZnVuY3Rpb24oYil7dGhpcy5QZT1ifSxNeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlfSxPZTpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2EmJih0aGlzLkliKyssCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTGMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sRmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sCmxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sZ3k6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMudHIoKXx8dGhpcy5pbygpO3RoaXMuRGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxQeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxpbzpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5hYSgxMCkpfSx0cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sVzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxLYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFZTpmdW5jdGlvbigpe3JldHVybiEwfSwKaXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFh4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmF9LGNhOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMH0sTWM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExoOmZ1bmN0aW9uKGIpe3RoaXMuQmI9Yn0sTHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPQpudWxsfSxSeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuQmImJihiPSEwKTtyZXR1cm4gYn0sYnk6ZnVuY3Rpb24oKXt0aGlzLnJnfHwodGhpcy5yZz0hMCl9LHZlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEl4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLmltfHxwOyhmdW5jdGlvbihjKXtjLnVpPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5JPXRoaXMucGxheWVyPSIiO3RoaXMuTWY9IjEiO3RoaXMuTmY9IjIiO3RoaXMuV249IjMiO3RoaXMuVGM9MDt0aGlzLm9oPTMwO3RoaXMuUmI9W107dGhpcy5oYj1bXTt0aGlzLnBjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLiRmPXRoaXMuZ2k9ITE7dGhpcy5zdGF0dXM9dGhpcy5UYzsKdGhpcy5pZD1lLmFhKDEwKTt0aGlzLmhmKGIpO3RoaXMuRnUoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5naXx8KHRoaXMuZ2k9ITAsZS5NZSgpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmJjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxOcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5rYSgpXXx8KHdpbmRvd1thLmthKCldPXt9KTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldfHwod2luZG93W2Eua2EoKV1bYi5sYSgpXT17fSx3aW5kb3dbYS5rYSgpXVtiLmxhKCldLmluaXRpYXRvcj1lLlpiKCkpO3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT93aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV0rKzp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV09MX0sVnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLAphPSEwLGg9bmV3IEo7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0uaW5pdGlhdG9yIT1lLlpiKCkmJih0aGlzLmpmKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMueGEoKSl7dGhpcy5OcigpO2lmKCF0aGlzLlZyKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmpmKCk7cmV0dXJufXRoaXMuamYoKTt0aGlzLkkodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLiRoKCk7dGhpcy4kZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSx1OmZ1bmN0aW9uKGIsYSl7dGhpcy54YSgpfHwodGhpcy5SYi5wdXNoKGIpLHRoaXMuaGIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5SYiYmMDx0aGlzLlJiLmxlbmd0aCYmKHRoaXMuUmI9CmUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaGIpe2Zvcih2YXIgaD0wO2g8dGhpcy5oYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5oYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5oYltoXS5yZWFzb25dPHRoaXMucGNbYl0mJihhPVtdLGEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksYj10aGlzLmhiW2hdLnJlYXNvbik7dGhpcy5wY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LFF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZ9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxqZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTmZ9LE11OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuV259LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTWZ9LHl4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk5mfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30saGY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxGdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0sWnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxCczpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMudWl8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3A9dGhpcy5hWzZdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuJGs9dGhpcy5hWzZdO3RoaXMuYng9dGhpcy5hWzEwXTt0aGlzLmlxPXRoaXMuYVs2XTsKdGhpcy5kaj10aGlzLmFbOV07dGhpcy5keD10aGlzLmFbOV07dGhpcy5Gcj10aGlzLmFbOF07dGhpcy5mcz10aGlzLmFbM107dGhpcy5Vbz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkdtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3A6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnByOnRoaXMuWmsoYSl9LFprOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy4kazp0aGlzLmF4KGEpfSxheDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYng6dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlxOnRoaXMuY2ooYSl9LGNqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZGo6dGhpcy5jeChhKX0sY3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR4OnRoaXMuRXIoYSl9LEVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gcjp0aGlzLmVzKGEpfSxlczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5mczp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLkdtfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ucCg0KTsoZnVuY3Rpb24oYyl7Yy5Haj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Hanx8b2E7KGZ1bmN0aW9uKGMpe2MuSGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLnp4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPwoodGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuSGp8fHBhOyhmdW5jdGlvbihjKXtjLklqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pOwp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Janx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNxPXRoaXMuYVs5XTt0aGlzLnVzPXRoaXMuYVsxMF07dGhpcy5KbT10aGlzLmFbMTBdO3RoaXMuTXI9dGhpcy5hWzEwXTt0aGlzLmJ3PXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMueWw9YjtiLnByb3RvdHlwZT17QnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNxOnRoaXMudHMoYSl9LHRzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51czp0aGlzLkltKGEpfSxJbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkptOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ncjp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy55bHx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQnEoNCk7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuTXA9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMueWt8fHNhOyhmdW5jdGlvbihjKXtjLnhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UYzt0aGlzLmlzUGxheWluZz10aGlzLlZjPSExO3RoaXMuYmU9MTt0aGlzLldjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlZjPSExO3RoaXMuYmU9MTt0aGlzLldjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5NcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueWQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlZjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5XYy5pbmRleE9mKGEpJiZ0aGlzLldjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuV2MubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LEJzOmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5WY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMueGt8fHRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuV3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5ZcihoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LEt4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFdxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy56a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sdj10aGlzLmFbNV07dGhpcy52aj10aGlzLmFbOV07dGhpcy5TdD10aGlzLmFbNF07dGhpcy5waz10aGlzLmFbMV07dGhpcy51dT10aGlzLmFbMl07dGhpcy5tcz10aGlzLmFbNV07dGhpcy5Caz10aGlzLmFbNF07dGhpcy5tcT10aGlzLmFbMV07dGhpcy51bT10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVszXX1jLndqPWI7Yi5wcm90b3R5cGU9e1F2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Sdjp0aGlzLnVqKGEpfSx1ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmo6dGhpcy5SdChhKX0sUnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlN0OnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wazp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1zOgp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQms6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1xOnRoaXMudG0oYSl9LHRtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMud2p8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlF2KDQpOyhmdW5jdGlvbihjKXtjLm1uPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSwKYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5tbnx8eGE7KGZ1bmN0aW9uKGMpe2MubG49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5GYz10aGlzLkNhPXRoaXMuJGM9ITE7dGhpcy5CaD1lLkhiKDEwKTt0aGlzLmZpPSEwO3RoaXMudWM9dGhpcy5XZz0hMTt0aGlzLlRzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5yaCgpLHRoaXMudnAoKSx0aGlzLnJiKCkpfSxUczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxjeTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkubGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi4kZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkouaWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5pZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkJoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFliOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSmc6ZnVuY3Rpb24oKXtpZighdGhpcy5GYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkZjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5GYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkZjfSxXcjpmdW5jdGlvbigpe2lmKCF0aGlzLlZnKXt2YXIgYj10aGlzLnliKCksYT10aGlzLlVyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5WZz0hMCl9cmV0dXJuIHRoaXMuVmd9LFVyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuJGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLiRjPSEwKTtyZXR1cm4gdGhpcy4kY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlliKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuaHUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksCjIwKX0saHU6ZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3ZhciBiPXRoaXMuSmcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnZjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApfSxKeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmIuYWRzJiYodGhpcy5vZz1iLmFkcyk7cmV0dXJuIHRoaXMub2d9LHZwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2EoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuSmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSw1MCkpfSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuV3IoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5ZYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5ZYigpLHRoaXMudWN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMueWIoKX1lbHNlIHRoaXMuV2c/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCksYj10aGlzLlliKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuV2c9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yaCgpfS5iaW5kKHRoaXMpLAo1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHdwOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud3AoKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5maT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5maSxmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sRHA6ZnVuY3Rpb24oKXt0aGlzLlN4fHwoMTA8dGhpcy53dz8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnd3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMub3UoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRHAoKX0uYmluZCh0aGlzKSwKNTApKSl9LG91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnh3KXt0aGlzLnh3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMubG58fHlhOyhmdW5jdGlvbihjKXtjLm5uPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS55ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpfX0pfSkoYyk7dmFyIHphPWMubm58fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbMTBdO3RoaXMuanA9dGhpcy5hWzRdO3RoaXMuU3I9dGhpcy5hWzZdO3RoaXMuWnM9dGhpcy5hWzVdOwp0aGlzLkFqPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs4XX1jLkx3PWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpwOnRoaXMuUnIoYSl9LFJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Tcjp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnM6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLkx3fHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9QmMuYW4oNCk7KGZ1bmN0aW9uKGMpe2MuWWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxLdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5iYyYmKDA8PWguaW5kZXhPZihkKXx8YS55ZCgpKX0sCnBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKToKd2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuWWx8fENhOyhmdW5jdGlvbihjKXtjLlhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9CjApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5EcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLkRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuS3QoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuWGx8fERhOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLlpsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanQ9dGhpcy5hWzNdO3RoaXMuU3M9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzhdO3RoaXMueHQ9dGhpcy5hWzhdO3RoaXMucmw9dGhpcy5hWzldO3RoaXMubGw9dGhpcy5hWzddO3RoaXMuSW89dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbM119Yy5icT1iO2IucHJvdG90eXBlPXtpdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanQ6dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNzOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wbDp0aGlzLnd0KGEpfSx3dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueHQ6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLmxsOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Jbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuYnF8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLml0KDQpOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkdnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMuTXQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD0KYi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5NdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmxkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5sZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubGQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxDcDpmdW5jdGlvbigpe2UuYmgodGhpcy5sZCk7CmUuRmUodGhpcy5sZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy52a3x8SGE7KGZ1bmN0aW9uKGMpe2MudWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMudWt8fElhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkdnKGIsImVsZW1lbnRJRCIpO2lmKGUuYmgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9ZWxzZSB0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLndrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuQWw9dGhpcy5hWzFdO3RoaXMuSXI9dGhpcy5hWzNdO3RoaXMueHU9dGhpcy5hWzRdO3RoaXMuRHI9dGhpcy5hWzZdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueW49dGhpcy5hWzddO3RoaXMuTW89dGhpcy5hWzVdO3RoaXMuWWs9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzVdfWMueGk9YjtiLnByb3RvdHlwZT17cXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ0OnRoaXMuemwoYSl9LHpsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWw6dGhpcy5IcihhKX0sSHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Jcjp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueHU6dGhpcy5DcihhKX0sQ3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkRyOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLnhuKGEpfSx4bjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW46dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1vOnRoaXMuWGsoYSl9LFhrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMueGl8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnF0KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9CmE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sR3U6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxqbzpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLlhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9bmV3IHooYSkpO3ZhciBjPXRoaXMuZ2I9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTsKaWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5PZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuR3UoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLllqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9CiIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5nYi5zZW5kKGEpfWNhdGNoKGYpe20mJm0uSWUodGhpcy4kYS51cmwpP20uT2Q/bS5pYSgicmVxdWVzdF9mYWlsZWQiKToKZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuWWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17S3U6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxKdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17aXg6IkFkQ2xpY2tUaHJ1IixreDoiQWRFcnJvciIsbHg6IkFkU3RvcHBlZCIsb3g6IkFkTGluZWFyQ2hhbmdlIixweDoiQWRUYWdQYXJzZWQiLHN4OiJBZFZpZGVvQ29tcGxldGUiLAp2eDoiQWRMb2FkZWQiLHd4OiJBZFNraXBwZWQiLHh4OiJBZFN0YXJ0ZWQiLG14OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsbng6IkFkSW1wcmVzc2lvbiIsang6IkFkQ3JlYXRpdmVWaWV3IixxeDoiQWRWaWRlb01pZHBvaW50IixyeDoiQWRQYXVzZWQiLHR4OiJBZFZpZGVvU3RhcnQiLHV4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LGx1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5IYSYmdGhpcy5IYS5WZClmb3IodmFyIGIgaW4gdGhpcy5IYS5WZCl0aGlzLkhhLlZkLmhhc093blByb3BlcnR5KGIpJiYKYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMubXUoKTt0aGlzLkhhJiZ0aGlzLmx1KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuV3A9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9IiI7dGhpcy5laD0hMTt0aGlzLndhPXRoaXMucWQ9IiI7dGhpcy4kZz10aGlzLlY9dGhpcy5pc0VuYWJsZWQ9dGhpcy5hZj0hMTt0aGlzLnBhPVtdO3RoaXMuUGc9dGhpcy5nYz0iIjt0aGlzLnJlPSExO3RoaXMuc2Y9MDt0aGlzLkhmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiOwp0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuS2Q9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5FcD10aGlzLlFkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9dGhpcy53Zj10aGlzLk9kPXRoaXMubGU9dGhpcy5VYz0hMTt0aGlzLmliPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnJkPTA7dGhpcy5SZz0hMTt0aGlzLlFnPTFFMzt0aGlzLmJkPSExO3RoaXMuUWE9MUUzO3RoaXMuUGY9IiJ9Yy5aaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5XcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnFkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZyxzZXJ2ZXI6dGhpcy5wYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlBnLGRpc2FibGVDb29raWVUZXN0OnRoaXMucmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuc2YsSE9NQURfVkVSSUZJRUQ6dGhpcy5IZixIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsCkhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuS2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkVwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk9kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaWIsc2l0ZUNvbmZpZzp0aGlzLkZhLHNlcnZlcklkOnRoaXMuS2gsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmtiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5OaCx2bWFwczp0aGlzLmxpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5iZCxhZEZhbGxiYWNrVVJMOnRoaXMuUGZ9fSwKcnI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxYcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsCmRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmFwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy54Y3x8dGhpcy53Ynx8dGhpcy53Y3x8dGhpcy5qZSkmJihnPXRoaXMuSXMoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ZcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Cmc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LEdjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnBhJiZ0aGlzLnBhLmxlbmd0aCYmMDx0aGlzLnBhLmxlbmd0aCYmKGI9dGhpcy5wYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9CmIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuRXg7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhW3RoaXMuS2hdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxiPXRoaXMuTWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsCmIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEhzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sQz0wO0M8Zy5sZW5ndGg7QysrKXt2YXIgaz1nW0NdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMucGgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj0KdGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LElzOmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkhzKGEsdGhpcy53YykpO3JldHVybiBhfSxCcDpmdW5jdGlvbigpe3RoaXMuRmEmJnRoaXMuRmEuY2xpZW50QVBJcyYmdGhpcy54cCh0aGlzLkZhLmNsaWVudEFQSXMpfSx4cDpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuS3UoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkp1KGEucGxheWVyKTtiLmcoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLAplKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlFkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5CcCgpO3RoaXMueHMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy52cygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSx4czpmdW5jdGlvbigpe3RoaXMuRGEobmV3IHoodGhpcy5xZCt0aGlzLmdlKCJnbG9iYWwiKSksCnRoaXMubHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sdnM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5GYSYmdGhpcy5GYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuRmEmJnRoaXMuRmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxpYTpmdW5jdGlvbihhKXtpZighdGhpcy5sZSl7dGhpcy5sZT0hMDsKdmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiYKYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpO3RoaXMuTmIoKTtlLkNjKGsuQ3QpOyhiPWUuJGIodGhpcy5zZCgpKSl8fChiPWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGxyOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPQp7fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy53YX1lbHNlIGE9dGhpcy53YTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGEuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLnBhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09CnRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuS2g9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMucGEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5nYyYmdGhpcy5MYSYmdGhpcy5wYS5sZW5ndGg/dGhpcy5IYyghMSk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPQohMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTt0aGlzLkRhKGIsdGhpcy5rdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY3VzdG9tZXIiKTthP3RoaXMuRG0/dGhpcy5pYSgibm9TVk1Db25maWciKToodGhpcy5EbT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGMoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxrdjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5PZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5pYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmtjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuS2Q9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnhjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMud2I9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuY2Q9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYmQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5lcihiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMucmUmJih0aGlzLmhjPW51bGwpO3RoaXMudGY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuSHYoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuS2QpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy5ydigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnN2KCkpfX0scnY6ZnVuY3Rpb24oKXt0aGlzLnF2KCk7dGhpcy50digpfSx0djpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmEoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5rZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuVmEoKSl7aWYodGhpcy5GYSYmdGhpcy5GYS5wbGF5ZXImJnRoaXMuRmEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7CnJldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxzdjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5VYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSxxdjpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUua2QoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmljKTsKYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy53dihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlBjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5LZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sd3Y6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMueHYoYywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSx4djpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1jO2sub25lcnJvcj1lO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy5wdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHB2OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5UaCgpOnRoaXMucWYoIkFBQSIpfSxUaDpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpOwp0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVWMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuSGYpKTt0aGlzLlFkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuUWQmJnRoaXMuUWQoKX0sQXA6ZnVuY3Rpb24oKXtpZih0aGlzLndmJiYKdGhpcy5ycigpKXt2YXIgYT10aGlzLlhxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnJkfHwodGhpcy5yZD0wKTt0aGlzLnJkKys7dGhpcy5yZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2MmJihhLm9pPSEwKTtxJiZlLlpyKCkmJihhLkJnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSx5cDpmdW5jdGlvbigpe2UuVmEoKXx8ZS5iYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuR2MoKXx8KGE9dGhpcy56YShjKSxjPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7Zy5uZXR3b3JrU3RhdGU9PQpnLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxudjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5saX0senA6ZnVuY3Rpb24oKXt0aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMuaHcuYmluZCh0aGlzKSx0aGlzLmd3LmJpbmQodGhpcykpfSxodzpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuQXEoKX0sZ3c6ZnVuY3Rpb24oKXt9LEFxOmZ1bmN0aW9uKCl7ZS5DYyhrLnpxKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmlhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxuZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuSmIubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxIdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxlcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPQphLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLlpqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5mcD10aGlzLmFbMl07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaGo9CnRoaXMuYVsxXTt0aGlzLmh0PXRoaXMuYVs4XTt0aGlzLmhzPXRoaXMuYVs1XTt0aGlzLlhtPXRoaXMuYVs3XTt0aGlzLlZ2PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzhdfWMuT2w9YjtiLnByb3RvdHlwZT17ZXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZwOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tbzp0aGlzLmdqKGEpfSxnajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaGo6dGhpcy5ndChhKX0sZ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmh0OnRoaXMuZ3MoYSl9LGdzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oczp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWG06dGhpcy5VdihhKX0sVXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5PbHx8UGEsRWM9bmV3IFBhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmVwKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy4kdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy5hZD0hMTt0aGlzLlhvPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307ZS5wYigibmV3QmlnQWRJZCIpO3RoaXMua3A9ZS5hYSgxMCk7dGhpcy5tZj0wO3RoaXMuWmM9IldlcmJ1bmcgLSBbdGltZV0iOwpjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWmM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWmM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMucG89Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkdkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5iYz0hMTt0aGlzLk9wPWUuYWEoMTApO3RoaXMuR2I9ZS5hYSgxMCk7dGhpcy5FYj1lLmFhKDEwKTt0aGlzLk9oPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLlJkPXRoaXMuT2I9dGhpcy5wZT10aGlzLmdkPXRoaXMuSWQ9CnRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubWQ9dGhpcy5Ldj10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLnhkPXt9fWMuVGo9YjtiLnByb3RvdHlwZT17QnU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLmR2KCk7ZS52KGsuZm8sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTGU6ZnVuY3Rpb24oYSxiLGMsZil7dGhpcy51Yj1jO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5BcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLG5ldyBTKHRoaXMsYSx0aGlzLm1oLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLm1jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5RYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLApjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUmQ9dGhpcy5PYj10aGlzLm1kPSExO3RoaXMuYz1hO3RoaXMuUHUodGhpcy5jKTt0aGlzLnhkPW5ldyBRYSh0aGlzLmMubncsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5IcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5IZD10aGlzLmhyKGEpKSx0aGlzLk1nKGEucGFyZW50KSl9LERnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YKYnx8KGM9dGhpcy5EZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLlNxKGEpKSk7cmV0dXJuIGN9LFNxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxocjpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxnPSIiO2lmKGEuVSl7Yj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEubGIoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpnfX0sc2E6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBiPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLmpkJiZhLmpkLmVycm9yJiZhLmpkLmVycm9yLmNvZGUmJihiPWEuamQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PQpHLlhkLmNvZGU/ZS52KGsuS3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5NZSgpLGI9PUcuS2YuY29kZSYmZS52KGsuVXMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk7ZS52KGsueXEsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmV2KCk7dGhpcy5YYSgiZW1wdHkiKTticmVhaztjYXNlIHcuSWYuY29kZTplLnYoay5pdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LkxmLmNvZGU6ZS52KGsuT3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuWWQuY29kZTplLnYoay5Qdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6ZS52KGsuVnMsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLmV3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5FZi5jb2RlOmUudihrLmZ3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLlhiKGEpO3RoaXMuUmEoKX0sWGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5LZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sUHU6ZnVuY3Rpb24oYSl7dGhpcy5wZT0hMTt0aGlzLlBiPQp0aGlzLmIuSzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5QYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuJGU9ITB9Y2F0Y2goZil7fX1jYXRjaChlKXt9Yi5keT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsCnRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTt0aGlzLnBvJiZ0aGlzLnBsYXllci52ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuTy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5PW2NdLnR5cGUpJiZ0aGlzLmtvKGIsYS5PW2NdLnVybCsiIixhLk9bY10udHlwZSk7dGhpcy4kZSYmYi5sb2FkKCk7aWYodGhpcy5YaChiKSl7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5ubyhiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7CnRyeXt0aGlzLiRlP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2goayl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5LcCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuTnUoKSk6dGhpcy5jLm9yaWdpbi51Zyh3LlVkKX0sTnU6ZnVuY3Rpb24oKXt0aGlzLkNmPSEwO3RoaXMuc2I9dGhpcy5uYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLm1nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5zYj0hMCk7ZS5vZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmCmUub28odGhpcy5jLm9yaWdpbi52YSk7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9RS5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi53aCgpO3RoaXMuYi5rZigpO2ZvcihhPXRoaXMuYi5LO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIua2YoKTt0aGlzLnRhPXRoaXMuUGI9dGhpcy5iLks7dGhpcy5oaSgidnBhaWQiKTtpZih0aGlzLnNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuS2IoIm11dGVkIiwiY29udGVudCIpO2UudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5LLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmtyKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmRnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5oZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJiF0aGlzLklkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay56YywKdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuYWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuc2M9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy55dyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnp3KCksdGhpcy5iLmFjKCEwKSwhdGhpcy5PYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy5ILApjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuR2UodGhpcy5PYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmFjKCEwKSx0aGlzLkR3KCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5IdygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5GdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkl3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkV3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm1pKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5WYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkwuYmR8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5RYyYmKHRoaXMuRGY9ITEsdGhpcy5mYygpKSx0aGlzLkJ3KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuc2I9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay52ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5zYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmhlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLmFnKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5ILCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sQXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLm5jPSEwfSxCdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlhjLHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubmM9ITF9LER3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sQ3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5RaCgpO2UudihrLlRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLlhjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubWQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlFmLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxHdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5WZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxJdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbWk6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7CmUub2UoKTt0aGlzLkg9ITE7dGhpcy5SYShhKX19LHl3OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5Kdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubWkoITApfSxrbzpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuR2MoKSl7dmFyIGQ9Yi56YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuc3cuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmMoYix0aGlzLkwpKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LG5vOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmlpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmppLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmppLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0saWk6ZnVuY3Rpb24oYSl7dGhpcy5XYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldifHx0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuWG8pKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWQmJnRoaXMuWGgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5XYil7dGhpcy5hZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5aYSgpLCEwKSx0aGlzLkwudGd8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLnB3KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIua2YoKTt0aGlzLm93KCk7dGhpcy5oaSgpO3RoaXMuZWcoKTt0aGlzLmIud2goKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMubmYoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nZHx8dGhpcy5SZigpfSxSZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmdkfHwoYT90aGlzLlJhKCk6KHRoaXMuUWUoITApLHRoaXMuUmYoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmVjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkxoKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuTC5rYiYmIXRoaXMuRmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5jbyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuUmEoKX0saG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9ITEsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9ZS5IZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQSgpKTtlLmJ2KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJgp0aGlzLmMuU2QmJnRoaXMuaG8odGhpcy5jLlNkKTtpZighdGhpcy5wZSlpZih0aGlzLnBlPSEwLHRoaXMuUmR8fChlLnYoay5Ycyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy50Ynx8dGhpcy5jLnFjKXtlLnBiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm1mKys7dGhpcy5XYj10aGlzLmFkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5HZD0hMTt0cnl7dGhpcy5iLmVpKCl9Y2F0Y2goZyl7fXRoaXMuSWQ9ITA7dGhpcy5iLkJlKCk7dGhpcy5iYz0hMTt0aGlzLnhlKCkuR2goKTt0aGlzLmMudGImJnRoaXMuYy5vcmlnaW4uUmUoKTt0aGlzLmMucWMmJihhP3RoaXMuYy5vcmlnaW4ucWgoKToKdGhpcy5xZSgpKX1lbHNlIHRoaXMucWUoKX0sc3c6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5XYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkwueXAoKTt0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxqaTpmdW5jdGlvbigpe2lmKHRoaXMuS3YpdGhpcy5SYSgpO2Vsc2V7dGhpcy5iYz0hMDt0aGlzLmIuZi5BYSYmIXRoaXMuSWQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dmFyIGE9Ck1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5OdihhKTtpZighdGhpcy5PYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5SZD0hMDtlLnYoay5raSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5sZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PaCkpJiYoYz10aGlzLmMubGYtCmEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy50Yj8odGhpcy5XYj10aGlzLmFkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5HZD0hMSx0aGlzLmIuZWkoKSx0aGlzLmMub3JpZ2luLlJlKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWmMucmVwbGFjZSgiW3RpbWVdIiwKZS5DZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmZlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxiaTpmdW5jdGlvbigpe3RoaXMudmh8fCh0aGlzLnZoPSEwLHRoaXMubWR8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxOdjpmdW5jdGlvbihhKXtlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuY2l8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYmkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5RaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLAp0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5rYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5UZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMubWQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLnYoay5RZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5jaT1hKX0sUGg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsYiwhMCl9LGR2OmZ1bmN0aW9uKCl7ZS5NZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxRaDpmdW5jdGlvbigpe2UuTWQoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0sZXY6ZnVuY3Rpb24oKXtlLk1kKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sClhhOmZ1bmN0aW9uKGEpe2UuTWQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuTC5rYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxLYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5rYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkZiKXt0aGlzLnhkJiZ0aGlzLnhkLnRyYWNrJiZ0aGlzLnhkLnRyYWNrKGEpO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLmlyKHRoaXMuYy5QYSxhKX1jYXRjaChmKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgZz1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmCih0aGlzLmtlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmUuWHIoZy51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZW8sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLktlKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmMuUGE9dGhpcy5VcCh0aGlzLmMuUGEsYSl9Y2F0Y2gobSl7fX19LFphOmZ1bmN0aW9uKCl7dmFyIGE9ZS5WYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixiPSIiO3RoaXMuQ2YmJihiPSJfdnBhaWQiKTt0aGlzLlFjJiYoYj0iX3dlbGVjdCIpO3JldHVybiBhK2J9LEtlOmZ1bmN0aW9uKGEsYixjLGYsZSl7YSYmInN0cmluZyI9PQp0eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxjJiZiLmpvKGMpLGZ8fChmPXRoaXMuc2cpLGV8fChlPXRoaXMuc2cpLHRoaXMubG8oYSksdGhpcy5MLkRhKGIsZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGxvOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09Im9wZW4ifSxGaDpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJjbG9zZWQifSxIcDpmdW5jdGlvbigpe3RoaXMuZGM9e319LGd2OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuZGMpdGhpcy5kYy5oYXNPd25Qcm9wZXJ0eShiKSYmIm9wZW4iPT10aGlzLmRjW2JdJiZhKys7cmV0dXJuIGF9LGlyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sVXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpifSl9LHB3OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5xdy5iaW5kKHRoaXMpKX0scXc6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmZjKCk6dGhpcy5jLlZiJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5MLmJkfHx0aGlzLlFjKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLlZifWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYy5WYixhKX19LmJpbmQodGhpcyksNTAwKSl9LApvdzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlpjLnJlcGxhY2UoIlt0aW1lXSIsZS5DZygwKSk7CnZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5jZCYmKGI9dGhpcy5MLmNkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5jZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sRWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5jZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGhpOmZ1bmN0aW9uKGEpe2lmKCFlLm9mKHRoaXMuY29udHJvbHMpKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpjLmlkPXRoaXMuT3A7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuR2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkViO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Ndi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkx2LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk9oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmMuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmxmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXt0aGlzLkJhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLm1nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGZjOmZ1bmN0aW9uKCl7dGhpcy5CYSYmImJsb2NrIj09dGhpcy5CYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxZaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuWGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxaaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMubmM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLm5jPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLm5jPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5YYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LEx2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxNdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuc2I/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5zYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMuc2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSwkdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmVjKTt0aGlzLmdkfHx0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0scWU6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUua2QoKTshdGhpcy5MLm1jfHxlLlZhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5rZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy50aHx8IXRoaXMuTC5VYyYmInNwaWVnZWwuZGUiIT1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwicHJlcm9sbCIhPWUuQ2I/KHRoaXMuZ2Q9ITAsdGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy5uZygpKToodGhpcy50aD10aGlzLlFjPXRoaXMuRGY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5rZT0hMCxhPWUuZGcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuTGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuZ3YoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy5JZD0hMCx0aGlzLmIuQmUoKSx0aGlzLmIucXUoKSx0aGlzLmJjPSExLAplLnYoay5OcCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMueGUoKS5HaCgpKX0seGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZWc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZS5GZSh0aGlzLnZpZGVvLGEpP3RoaXMuSWgoKTp0aGlzLnlkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVmIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5zYyYmMDx0aGlzLnNjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5zYykpO3RoaXMudmlkZW8mJgp0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMua3ArIi0iK3RoaXMubWY7dGhpcy5jJiZ0aGlzLmMuSWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLklnKCkpO3JldHVybiBhfSxzZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuVGp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRwPXRoaXMuYVsyXTt0aGlzLm50PXRoaXMuYVs4XTt0aGlzLll3PXRoaXMuYVsxXTt0aGlzLm5rPXRoaXMuYVsxMF07dGhpcy5raz10aGlzLmFbNV07dGhpcy5Vbj10aGlzLmFbNV07dGhpcy5Bbj10aGlzLmFbNl07dGhpcy5lbj10aGlzLmFbMV07dGhpcy52cj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLkJpPWI7Yi5wcm90b3R5cGU9CntTcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVHA6dGhpcy5tdChhKX0sbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm50OnRoaXMuWHcoYSl9LFh3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Zdzp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubms6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmtrOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Vbjp0aGlzLnpuKGEpfSx6bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQW46dGhpcy5kbihhKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVuOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuQml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5TcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkdhPW51bGw7dGhpcy5ZPVtdO3RoaXMuVT1udWxsO3RoaXMucmM9dGhpcy50Yz0hMTt0aGlzLnZhPSIiO3RoaXMuQmY9ITE7dGhpcy5UZz0iIjtkJiZkLmVtcHR5P3RoaXMuQXMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5rbj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5rZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPQohMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bS55YShtLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVmEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlKXthPWUucGcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uSmQoYSkpKyImdHlwZT1qcyIsYj1tLnlhKG0uSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0ueWEobS5KZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnpzLmJpbmQodGhpcyksdGhpcy53cy5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkdhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5DYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuQ2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkNifHx0aGlzLmJzKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLm52KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGJzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0senM6ZnVuY3Rpb24oYSl7dGhpcy5adChhKTt0cnl7dGhpcy5HYT1hLnJlc3BvbnNlWE1MLHRoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOgpHLkpmfSkpfSxBczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWWQpKX10aGlzLlk9dGhpcy5FZygpO3RoaXMudGM9dGhpcy5yZigpO3RoaXMucmM9dGhpcy5VaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5KYygpOnRoaXMuc2EodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkJmP0cuWGQ6Ry5KZn0pKX0sd3M6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5JZix7ZGVwdGg6YX0pKX0sSmM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5kcygpP3RoaXMueXYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMuUnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMuY3coKSYmdGhpcy5XZSh0aGlzLlJwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPwoodGhpcy50Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5SZSgpfSxxaDpmdW5jdGlvbigpe3RoaXMucmM/KHRoaXMucmM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSmMoKSk6dGhpcy5wYXJlbnQucWgoKX0sY3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52digpP3RoaXMudXYoKT8hMDooLTEhPXRoaXMuRGMoKT90aGlzLnNhKHRoaXMuU2Eody5UZCkpOnRoaXMuc2EodGhpcy5TYSh3LkVmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5TYyxHLktmKSksITEpfSxXZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5TZHx8KGEuU2Q9W10pO2EuU2QucHVzaCh0aGlzLlRnKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuQWc7dGhpcy5wYXJlbnQuV2UoYSl9LFJwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuRGMoKTthLk89dGhpcy5LZygpO2EuVmI9dGhpcy5UcSgpO2Eubnc9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5RcSgpO2EubGY9dGhpcy5ncihhLmR1cmF0aW9uKTthLmFiPWEuYWI/YS5hYjotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuQWc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLmFiPWIuYWI/Yi5hYjotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuQWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlVxKCkpOmIuUGEuY29uY2F0KHRoaXMuYnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5YYiYmdGhpcy5wYXJlbnQuWGIoYiksYT0wLHRoaXMuSmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxYYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5YYihhKX0sdWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30seXY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSx2djpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuS2coKS5sZW5ndGh9LHV2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSxVaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxadDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuQmY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sZHM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk5nKCkubGVuZ3RofSxOZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LFJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5sYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuYWgoYS5wYXJlbnROb2RlKTohMX0sYnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sVXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFRxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxGeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5wZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxncjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLmF2KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5wZChhKToiIn0scGQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLmtufHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp2PXRoaXMuYVs1XTt0aGlzLm5tPXRoaXMuYVsxXTt0aGlzLmlsPXRoaXMuYVs4XTt0aGlzLnhsPXRoaXMuYVs3XTt0aGlzLlJ3PXRoaXMuYVsxMF07dGhpcy5ObD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLlBxPWI7Yi5wcm90b3R5cGU9e0l2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kdjp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlsOnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54bDoKdGhpcy5RdyhhKX0sUXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJ3OnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlBxfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Jdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5mbT1iO2IucHJvdG90eXBlPXtLcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSwkcTpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy4kcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sa3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmZtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5UaT10aGlzLmFbOF07dGhpcy5Paz10aGlzLmFbOV07dGhpcy5lbT0KdGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzZdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuZ2s9dGhpcy5hWzRdO3RoaXMuenQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5adj1iO2IucHJvdG90eXBlPXtTaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVGk6dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk9rOnRoaXMuZG0oYSl9LGRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbTp0aGlzLkN2KGEpfSxDdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHY6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nazp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlp2fHxXYSxIYz1uZXcgV2EoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuU2koNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApneDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGh4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlB2PXRoaXMuYVs4XTt0aGlzLlZtPXRoaXMuYVs3XTt0aGlzLkRvPXRoaXMuYVsxMF07dGhpcy5QaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLkV2PWI7Yi5wcm90b3R5cGU9e092OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qdjp0aGlzLlVtKGEpfSxVbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm06dGhpcy5DbyhhKX0sQ286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkRvOnRoaXMuT2koYSl9LE9pOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuRXZ8fFhhLEljPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk92KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj0KYTt0aGlzLmpkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuRmo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkZqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KaT10aGlzLmFbMV07dGhpcy5VdD10aGlzLmFbN107dGhpcy53aT10aGlzLmFbMV07dGhpcy5jbT10aGlzLmFbNl07dGhpcy5VdT10aGlzLmFbNl07dGhpcy5HbD10aGlzLmFbMTBdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuUHI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy54bT1iO2IucHJvdG90eXBlPXtJaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSmk6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdDp0aGlzLnZpKGEpfSx2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5ibShhKX0sYm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5jbTp0aGlzLlR1KGEpfSxUdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXU6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdsOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50azp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUHI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLnhtfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5JaSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSGg9YTt0aGlzLnZpZGVvPWI7dGhpcy5QZD1bXTt0aGlzLkVoPVtdO3RoaXMuU2U9W107dGhpcy5ydz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLmpsPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLiR4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm51LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmZ1LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwpsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuUGQucHVzaCh7c3JjOmMsZnJhbWU6ZyxCdDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5TZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlNlW2JdO2MudHlwZT09PWEmJmMudXAodGhpcy5WcShhKSl9fSxWcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpeTohMCxoeTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntXeDoidmlkZW8iLGt5OiJqc0N1c3RvbSIsbHk6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbXk6MSxHeDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LGpyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5QZC5sZW5ndGg7YisrKWlmKHRoaXMuUGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5QZFtiXS5CdDtyZXR1cm4iIn0sbnU6ZnVuY3Rpb24oYSxiKXt0aGlzLkVoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLmpyKGIpLHZlbmRvcjpifSk7CnRoaXMuY3YoKX0sZnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnJ3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSx1cDpiLGZ5OiExfSl9LGN2OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS4kcnx8KGEuWngoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmp5LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS4kcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5qbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmo9dGhpcy5hWzEwXTt0aGlzLm5sPXRoaXMuYVsxXTt0aGlzLlNrPQp0aGlzLmFbNV07dGhpcy5Ecz10aGlzLmFbNV07dGhpcy5ncT10aGlzLmFbMl07dGhpcy52bD10aGlzLmFbM107dGhpcy5zbT10aGlzLmFbMl07dGhpcy5DbT10aGlzLmFbM107dGhpcy5Tbj10aGlzLmFbNF07dGhpcy5Raz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLkdzPWI7Yi5wcm90b3R5cGU9e2FqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5iajp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmw6dGhpcy5SayhhKX0sUms6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNrOnRoaXMuQ3MoYSl9LENzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy51bChhKX0sdWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52bDp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNtOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuQ206dGhpcy5SbihhKX0sUm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNuOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Razp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuR3N8fFphLEtjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLmFqKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMuZj1hO3RoaXMuamI9YS5GZygpO3RoaXMuSz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLksuaWQ9ZS5hYSgxMCk7dGhpcy5GPUUucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5jZz0hMTt0aGlzLlRiPVtdfWMub2o9YjtiLnByb3RvdHlwZT17T3E6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5PcShhKTtmb3IodmFyIGI9MCxjPTAsZT0hMSxnPXRoaXMud3IoYSksaz17fTthOyliKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGp2OmZ1bmN0aW9uKCl7dGhpcy5jZz0hMH0sZWk6ZnVuY3Rpb24oKXt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LAp3aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLnpjLHRoaXMuZi5zKCkpfSxxdTpmdW5jdGlvbigpe3RoaXMuY2d8fCh0aGlzLmYucGxheSgpLGUudihrLmZkLHRoaXMuZi5zKCkpKX0sa2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuSy5zdHlsZS56SW5kZXg9YTt0aGlzLksuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5LLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLksuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLksuc3R5bGUuYm94U2l6aW5nPXRoaXMuamIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSy5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PXRoaXMuamIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5qYik7dGhpcy5mLk1jJiZ0aGlzLmYuTWMoKT90aGlzLmYuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5LKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSx3cjpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGImJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sSXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249CmIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sYWM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JcSh0aGlzLmpiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkJlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5NYygpPyh0aGlzLksuc3R5bGUubGVmdD0iMHB4Iix0aGlzLksuc3R5bGUudG9wPSIwcHgiKToodGhpcy5LLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5LLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5LLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KwoicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLm9mKHRoaXMuSykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGFnOmZ1bmN0aW9uKGEpe3RoaXMuVGJ8fCh0aGlzLlRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5UYi5wdXNoKGEpfSxCZTpmdW5jdGlvbigpe3RoaXMuSyYmdGhpcy5LLnBhcmVudE5vZGUmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkspO3RoaXMuRiYmdGhpcy5GLnBhdXNlJiZ0aGlzLkYucGF1c2UoKX19fSkoYyk7Zm9yKHZhciAkYT1jLm9qfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtFLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FbD10aGlzLmFbN107dGhpcy54cT10aGlzLmFbMV07dGhpcy55bz10aGlzLmFbMV07dGhpcy5MbD10aGlzLmFbNF07dGhpcy5ycT10aGlzLmFbM107dGhpcy5Odz10aGlzLmFbMl07dGhpcy5Hbz10aGlzLmFbMV07dGhpcy5haz10aGlzLmFbNF07dGhpcy51bj10aGlzLmFbNl07dGhpcy5qPQp0aGlzLmFbMl19Yy5ocD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWw6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhxOnRoaXMueG8oYSl9LHhvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55bzp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGw6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJxOnRoaXMuTXcoYSl9LE13OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Odzp0aGlzLkZvKGEpfSxGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR286dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFrOnRoaXMudG4oYSl9LHRuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJiPWMuaHB8fGJiLExjPQpuZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5EbCg0KTsoZnVuY3Rpb24oYyl7Yy5TbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5XKGEpO3RoaXMuRGQoYik7dGhpcy5xZygpfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0scWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkthKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLAphP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sRWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5LYSgpOwppZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLlNsfHxjYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuVWY9dGhpcy5XZj10aGlzLlhnPXRoaXMuZWE9dGhpcy51Zj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkVxKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51Zj0hMDt0aGlzLlhnJiZ0aGlzLmtnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsCiJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJmEuYmMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuWGc9ITA7dGhpcy5rZygpfS5iaW5kKHRoaXMpKTt0aGlzLmdnKCl9LGtnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Ipe3RoaXMuZGQoKTtpZighdGhpcy51ZiYmIXRoaXMuZGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnVmJiZ0aGlzLlVmJiYhdGhpcy5XZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGRkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpOwpyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sTGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sZ2c6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPXRoaXMuTGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5XZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlVmPWIuRHh9dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSxIeDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5VeCgpOiExfSxEYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkRjKCk6LTF9LGNyOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LEVxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlNifHwzMDI9PXRoaXMuU2I/dGhpcy5lYT0hMDp0aGlzLnUoImFkZXJyb3IiLHRoaXMuU2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOmIuRWUoKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5jcihiKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksCjJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy5SbHx8ZGI7KGZ1bmN0aW9uKGMpe2MuVGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxhczpmdW5jdGlvbigpe3dpbmRvdy5PTy5sbS5Ybi5Wbj93aW5kb3cuT08ubG0uWG4uVm4uQngoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYXMoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS55ZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgY2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IGRiKGMsCnRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy5UbHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ0PXRoaXMuYVs1XTt0aGlzLnZ3PXRoaXMuYVs4XTt0aGlzLllwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzhdfWMuYXE9YjtiLnByb3RvdHlwZT17YXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJ0OnRoaXMudXcoYSl9LHV3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52dzp0aGlzLlhwKGEpfSxYcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWXA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLmFxfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuYXQoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLnpoKCl9LHpoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ZaXx8aGI7KGZ1bmN0aW9uKGMpe2MuWGk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0saGc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucmEoKTp0aGlzLm0oKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuaGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sQ2g6ZnVuY3Rpb24oYil7Yj1uZXcgaGIoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fChiLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlIoYiksKG5ldyBpYihiLHRoaXMuSSkpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZxfHwodGhpcy5GcT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuQ2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkNoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7CnRoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuWml8fGpiLFQ9bmV3IGpiKHIpO1QuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZ3PXRoaXMuYVsxXTt0aGlzLlFsPXRoaXMuYVsxXTt0aGlzLnFzPXRoaXMuYVs2XTt0aGlzLkF2PXRoaXMuYVsxMF07dGhpcy5paz10aGlzLmFbMV07dGhpcy5ycD10aGlzLmFbOV07dGhpcy5idT10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLkFpPWI7Yi5wcm90b3R5cGU9e1V3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Wdzp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFsOnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xczp0aGlzLnp2KGEpfSx6djpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQXY6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5pazp0aGlzLnFwKGEpfSxxcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJwOnRoaXMuYXUoYSl9LGF1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5idTp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkFpfHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5Vdyg0KTsoZnVuY3Rpb24oYyl7Yy5ObT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuTm18fFU7KGZ1bmN0aW9uKGMpe2MuTW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guWWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlljKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuJHMoYSl9LmJpbmQodGhpcykpO3guWWMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5ZYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3gucXIoKX0sJHM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwKMzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLk1tfHxWOyhmdW5jdGlvbihjKXtjLk9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTsKdGhpcy53ZCYmKGI9ZS5WcChiLHRoaXMud2QpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLndkfHwodGhpcy53ZD1bXSksdGhpcy53ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWWM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8Cih0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LEJ2OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5wdSgpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxxcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9CmEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5CdihiKX19KX0pKGMpO3ZhciBsYj1jLk9tfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpuPXRoaXMuYVsxXTt0aGlzLldrPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMudHc9YjtiLnByb3RvdHlwZT17aG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuVmsoYSl9LFZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuV2s6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYj1jLnR3fHxtYixPYz1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy5obig0KTsoZnVuY3Rpb24oYyl7Yy5VaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxBYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuVWl8fG5iOyhmdW5jdGlvbihjKXtjLlZpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMudSgibm9BZCIsInBsYXllZCIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLlZpfHxvYjsoZnVuY3Rpb24oYyl7Yy5XaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpOwppZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBuYihkKTt0aGlzLk4oZyl8fCh0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLldpfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1wPXRoaXMuYVs1XTt0aGlzLmVxPXRoaXMuYVs3XTt0aGlzLkp0PXRoaXMuYVs0XTt0aGlzLlVrPXRoaXMuYVs2XTt0aGlzLmduPXRoaXMuYVs4XTt0aGlzLndtPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuUXU9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1wOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lcTp0aGlzLkl0KGEpfSxJdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSnQ6dGhpcy5UayhhKX0sVGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVrOnRoaXMuZm4oYSl9LGZuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbjp0aGlzLnZtKGEpfSx2bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj0KYy5RdXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMubHAoNCk7KGZ1bmN0aW9uKGMpe2MuSWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuZXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZXU6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJgphLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFlnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuSWx8fHNiOyhmdW5jdGlvbihjKXtjLkhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLkhsfHx0YjsoZnVuY3Rpb24oYyl7Yy5KbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9CmwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5KbHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZmo9dGhpcy5hWzddO3RoaXMuUHM9dGhpcy5hWzNdO3RoaXMuc3U9dGhpcy5hWzZdO3RoaXMuZng9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy5Hcj1iO2IucHJvdG90eXBlPXtlajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmo6dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBzOgp0aGlzLnJ1KGEpfSxydTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnN1OnRoaXMuZXgoYSl9LGV4OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5meDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuR3J8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmVqKDQpOyhmdW5jdGlvbihjKXtjLnFuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMucW58fAp3YjsoZnVuY3Rpb24oYyl7Yy5wbj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxZYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sY3U6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5jdSh0aGlzLkNhKToodGhpcy5DYT10aGlzLlliKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpO3JldHVybn1pZighdGhpcy51Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZiLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmZiW2FdJiYzMDMhPXRoaXMuZmJbYV0mJjQwMyE9dGhpcy5mYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKNTAwKX19KX0pKGMpO3ZhciB4Yj1jLnBufHx4YjsoZnVuY3Rpb24oYyl7Yy5ybj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMucm58fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MbT10aGlzLmFbMV07dGhpcy5HcD10aGlzLmFbMV07dGhpcy5SbT10aGlzLmFbOV07dGhpcy5Rbj10aGlzLmFbOV07CnRoaXMua3E9dGhpcy5hWzEwXTt0aGlzLnp1PXRoaXMuYVs2XTt0aGlzLnVvPXRoaXMuYVsyXTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzJdfWMuY249YjtiLnByb3RvdHlwZT17S206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxtOnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HcDp0aGlzLlFtKGEpfSxRbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUm06dGhpcy5QbihhKX0sUG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlFuOnRoaXMuanEoYSl9LGpxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcTp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuenU6dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVvOnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT8KdGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLmNufHxBYixSYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5LbSg0KTsoZnVuY3Rpb24oYyl7Yy56bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5YZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuTHQoKX0uYmluZCh0aGlzKSw1MDApfSxMdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJgphJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5YZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5YZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxmdjpmdW5jdGlvbigpe3RoaXMuWGU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBCYj1jLnptfHxCYjsoZnVuY3Rpb24oYyl7Yy55bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubGM9MH0sZzpmdW5jdGlvbigpe3RoaXMuRnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmxjfHwodGhpcy5sYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5sY3x8dGhpcy5sYysrLHRoaXMubGM8PXRoaXMuRnM/KHRoaXMubGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLmZ2KCksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBDYj1jLnltfHxDYjsoZnVuY3Rpb24oYyl7Yy5BbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgQ2IoYix0aGlzLkkpKS5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBEYj1jLkFtfHxEYixFYj1uZXcgRGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnE9dGhpcy5hWzZdO3RoaXMubHQ9dGhpcy5hWzNdO3RoaXMuSGk9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy50dD1iO2IucHJvdG90eXBlPXt1cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnE6dGhpcy5rdChhKX0sa3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmx0OnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLnR0fHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1TYy51cSg0KTsoZnVuY3Rpb24oYyl7Yy5wbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLnBtfHxHYjsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzsKYSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLkxwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMub2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnNzKCk6dGhpcy5qZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LExwOmZ1bmN0aW9uKCl7dGhpcy5TZigpfHx0aGlzLm0oITApfSxzczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm9kKCk7IWIucWEmJmIuWSYmYi5BeCYmYi5DeCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoKX0uYmluZCh0aGlzKSwxMDApfSxvZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVoKWZvcih2YXIgYj1sLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLmlkLApjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudWg9YltjXSk7cmV0dXJuIHRoaXMudWh9LFZ4OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLm9kKCkuYWRzTG9hZGVyP3RoaXMuRyghMCk6dGhpcy5HKCk6dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEhiPWMub218fEhiOyhmdW5jdGlvbihjKXtjLnFtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwucGxheWVyYXBpKXt2YXIgYj1sLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgSGIoYyx0aGlzLkkpKS5nKCkpfXJldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgSWI9Yy5xbXx8SWIsSmI9bmV3IEliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNqPXRoaXMuYVszXTt0aGlzLnduPXRoaXMuYVs0XTt0aGlzLlNqPXRoaXMuYVs1XTt0aGlzLktxPXRoaXMuYVs2XTt0aGlzLkRpPXRoaXMuYVs4XTt0aGlzLnNvPXRoaXMuYVs3XTt0aGlzLldvPXRoaXMuYVs2XTt0aGlzLnppPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzZdfWMucnM9YjtiLnByb3RvdHlwZT17Qmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNqOnRoaXMudm4oYSl9LHZuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud246dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNqOgp0aGlzLkpxKGEpfSxKcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS3E6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRpOnRoaXMucm8oYSl9LHJvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zbzp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV286dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56aTp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnJzfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5Caig0KTsoZnVuY3Rpb24oYyl7Yy5mbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxUeDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxNYzpmdW5jdGlvbigpe3JldHVybiEwfSxLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9CmMuZmx8fFg7KGZ1bmN0aW9uKGMpe2MuZGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlllJiZiIT10aGlzLlllfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLmF5KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuZGx8fFk7KGZ1bmN0aW9uKGMpe2MuZ2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5uYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuZ2x8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY2s9dGhpcy5hWzEwXTt0aGlzLiRwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuRW89YjtiLnByb3RvdHlwZT17Yms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmNrOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuRW98fE5iLFVjPW5ldyBOYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5iayg0KTsoZnVuY3Rpb24oYyl7Yy5Qaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LEF1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LApBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5Qanx8T2I7KGZ1bmN0aW9uKGMpe2MuT2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5Panx8UGI7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpOwp2YXIgUWI9Yy5Ranx8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs2XTt0aGlzLkZtPXRoaXMuYVsyXTt0aGlzLmNsPXRoaXMuYVsxXTt0aGlzLlN1PXRoaXMuYVs2XTt0aGlzLld0PXRoaXMuYVs0XTt0aGlzLldsPXRoaXMuYVs3XTt0aGlzLnZ0PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzZdfWMuRnQ9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRsOnRoaXMuRW0oYSl9LEVtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GbTp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5SdShhKX0sUnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlN1OnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV3Q6dGhpcy5WbChhKX0sClZsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbDp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLkZ0fHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Fbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSwKTmQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LGR1OmZ1bmN0aW9uKCl7dGhpcy5SYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJjfHwodGhpcy5SYz0hMCx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5OZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxBYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuRW58fFRiOyhmdW5jdGlvbihjKXtjLkRuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LERoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSwKYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VYihhKX0uYmluZCh0aGlzKSkpLGImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5EaC5iaW5kKHRoaXMpLDEwKX0sVWI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT0KYS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxPZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5VYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuT2YoKTt0aGlzLmd1KCl9LGd1OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGIpe3RoaXMuVWIoYil9KX0sbTpmdW5jdGlvbihiKXt0aGlzLiR0P3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihiKXt0aGlzLiR0PSEwO2lmKGImJmIuZGV0YWlsKWZvcih2YXIgYSBpbiBiLmRldGFpbCkiYWRUYWdVcmwiPT1hJiYoYi5kZXRhaWxbYV18fHRoaXMuVWIoYikpfX0pfSkoYyk7dmFyIFViPWMuRG58fFViOyhmdW5jdGlvbihjKXtjLkZuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIuZHUoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpOwp2YXIgVmI9Yy5Gbnx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLlluPWI7Yi5wcm90b3R5cGU9e2pzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLllufHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy5qcyg0KTsoZnVuY3Rpb24oYyl7Yy5abT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLnhoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT0KYi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLk5zPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxBdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTnN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy54aCYmCih0aGlzLnhoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy5abXx8TzsoZnVuY3Rpb24oYyl7Yy5ZbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuTXUoKTp0aGlzLm0oITApLCEwO3RoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubSgpOnRoaXMubSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnVlPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlM9CnRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLlltfHxQOyhmdW5jdGlvbihjKXtjLiRtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwKKHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuY2YoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLiRtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMucms9dGhpcy5hWzZdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy5Xdj1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSHQ6CnRoaXMucWsoYSl9LHFrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5yazp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Xdnx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuR3QoNCk7KGZ1bmN0aW9uKGMpe2MuSms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ka3x8WjsoZnVuY3Rpb24oYyl7Yy5Jaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5yYigpLCEwO3RoaXMuVWcrKztpZigxMDx0aGlzLlVnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0KITB9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLklrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Laz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLktrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY3A9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzldO3RoaXMuTm49dGhpcy5hWzZdO3RoaXMuS3I9dGhpcy5hWzVdO3RoaXMuSG49dGhpcy5hWzRdO3RoaXMucHE9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5saz1iO2IucHJvdG90eXBlPXticDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY3A6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5lazp0aGlzLk1uKGEpfSxNbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTm46dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktyOnRoaXMuR24oYSl9LEduOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Ibjp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLmxrfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5icCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJgphPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Nanx8ZGM7KGZ1bmN0aW9uKGMpe2MuTGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaWcoKX0saWc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLkxqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Oaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLk5qfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHQ9dGhpcy5hWzldO3RoaXMucmo9dGhpcy5hWzZdO3RoaXMuQnI9dGhpcy5hWzNdO3RoaXMuS3M9dGhpcy5hWzNdO3RoaXMuV3U9dGhpcy5hWzEwXTt0aGlzLkpuPXRoaXMuYVs1XTt0aGlzLnB0PXRoaXMuYVs2XTsKdGhpcy5qPXRoaXMuYVsxMF19Yy5zdD1iO2IucHJvdG90eXBlPXtjdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZHQ6dGhpcy5xaihhKX0scWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnJqOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ccjp0aGlzLkpzKGEpfSxKczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3M6dGhpcy5WdShhKX0sVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLld1OnRoaXMuSW4oYSl9LEluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kbjp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucHQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLnN0fHxoYyxaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9WmMuY3QoNCk7KGZ1bmN0aW9uKGMpe2Mucmk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMucml8fGljOyhmdW5jdGlvbihjKXtjLnBpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGZnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5mZy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnBpfHxqYzsoZnVuY3Rpb24oYyl7Yy5zaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9Cm5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnNpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQW89dGhpcy5hWzJdO3RoaXMuRWo9dGhpcy5hWzRdO3RoaXMuQ2w9dGhpcy5hWzhdO3RoaXMuVG09dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzddO3RoaXMuaj0KdGhpcy5hWzNdfWMuUXM9YjtiLnByb3RvdHlwZT17em86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkFvOnRoaXMuRGooYSl9LERqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fajp0aGlzLkJsKGEpfSxCbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2w6dGhpcy5TbShhKX0sU206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRtOnRoaXMuSm8oYSl9LEpvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMuUXN8fG1jLCRjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLnpvKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdOwp0aGlzLmJmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj8KbnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcWI/bnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLmhtPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuZHIoYSk6W10sYjt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107CnRoaXMueGYoYikmJih0aGlzLnpkLnB1c2goYiksdGhpcy5KaChiKSl9fSx4ZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmJmW2NdLHRoaXMueGYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5nKCl9LGh2OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG5jPWMuaG18fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5RcD10aGlzLmFbMV07dGhpcy5Gaz10aGlzLmFbN107dGhpcy5NcT10aGlzLmFbMTBdO3RoaXMuTXM9dGhpcy5hWzddO3RoaXMuWXU9dGhpcy5hWzZdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMueWo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5ncD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUXA6dGhpcy5FayhhKX0sRWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZrOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5NcTp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTXM6dGhpcy5YdShhKX0sWHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLll1OnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cjp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5ncHx8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9YWQuUHAoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQ2Moay5kdyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywKITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkNjKGsuV3MpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgYmQ9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLlpnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWmcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTsKSS5rYSgpO3ZhciBjZD1iZChmdW5jdGlvbigpe2Uuemcod2luZG93LEkuUXIoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhxPXRoaXMuYVs3XTt0aGlzLll2PXRoaXMuYVs0XTt0aGlzLmJvPXRoaXMuYVszXTt0aGlzLm5yPXRoaXMuYVs3XTt0aGlzLmpqPXRoaXMuYVs0XTt0aGlzLlFvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMuQm89YjtiLnByb3RvdHlwZT17R3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYm86dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5yOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuamo6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5Cb3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuR3EoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnloPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy51ZD0wO3RoaXMuZWI9IiI7dGhpcy5BZD1bXTt0aGlzLkJkPTA7dGhpcy5BaD0hMTt0aGlzLlplPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnRpPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3RoaXMueWg9YX0saGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKRHU6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSxOYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5iYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLlRyKCkpdGhpcy5uYi5sKHRoaXMubmIucWQsCnRoaXMubmIud2EsdGhpcy5uYi5hZixmdW5jdGlvbigpe3RoaXMuTmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLkJjKTtlbHNlIGlmKHRoaXMuc3IoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmp2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm5iLGcpO2wuQnUodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkVzKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJgooYz10aGlzLnBsYXllci5KZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5MZShhLGMsZik7dGhpcy5wbGF5ZXIuTGgobCl9fSxUcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnVkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yj8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LCR1OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UuZ2YoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX0sWnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueWgpe2UuZ2YoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLkl1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnZnKGMpKT90aGlzLk5jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LGp1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuT3UodGhpcy5adS5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuTmEoKX0sRmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZ2YoIm1pZHJvbGwiKTtpZighdGhpcy5uaCl7dGhpcy5uaD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5OYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX19LGl1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHUodGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy4kdSgpO3RoaXMucGxheWVyLk9lJiZ0aGlzLml1KCk7dGhpcy5qdSgpfSxrdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5BZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuV3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxzcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSx2dTpmdW5jdGlvbihhKXt0aGlzLkFoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuUHQuYmluZCh0aGlzKSl9LFB0OmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLlplLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy5BaCgpfSxFczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5aZS5sZW5ndGg7YysrKWI9CnRoaXMuWmVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubXY9dGhpcy5hWzRdO3RoaXMuS2o9dGhpcy5hWzNdO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnRxPXRoaXMuYVs1XTt0aGlzLlR3PXRoaXMuYVszXTt0aGlzLmZ0PXRoaXMuYVs4XTt0aGlzLlR2PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzldfWMuUG09YjtiLnByb3RvdHlwZT17bHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm12OnRoaXMuSmooYSl9LEpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2o6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMuc3EoYSl9LHNxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6CnRoaXMuU3coYSl9LFN3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udzp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZnQ6dGhpcy5TdihhKX0sU3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Udjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuUG18fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLmx2KDQpfSkuY2FsbChhdUZlZXNodWVlWWFpeW9vLGF1RmVlc2h1ZWVZYWl5b28pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
5.9.139.135
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.135.139.9.5.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.giga.de/0fc108712c36f40a63c49d96ec2de39b96b82f3f/
Frame E2F6
|
42 B
875 B
|
150ms
102ms
|
XHR
image/gif |
5.9.139.135
HETZNER-AS
|
|
General
- Full URL
- https://ssl.2.damoh.giga.de/0fc108712c36f40a63c49d96ec2de39b96b82f3f/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGF1RmVlc2h1ZWVZYWl5b289YXVGZWVzaHVlZVlhaXlvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5wcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5EdShtKTthLkN1KGwpO2Eua3UoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5MdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXQ9dGhpcy5hWzVdO3RoaXMuTG49dGhpcy5hWzEwXTt0aGlzLndvPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLnFvPWI7Yi5wcm90b3R5cGU9e1h0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZdDp0aGlzLktuKGEpfSxLbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTG46dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndvOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5GaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMucW98fGhhLHNjPQpuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5YdCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5wcD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuT3QuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5Waj1iO2IucHJvdG90eXBlPXtpdjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTsKdGhpcy5vYlthXSs9MTs1PHRoaXMub2JbYV0mJiF0aGlzLlNnW2FdJiYodGhpcy5TZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLml2KCksITApKX0sb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sb286ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSwKe3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxPdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5OdChhLmRhdGEpfSxOdDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9CkpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sSGc6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbW86ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLk5xKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PQpiLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09YX19LE5xOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxjczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9CmFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sb2Y6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOgohMTohMX0sRmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO3E9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmUoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYKMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09CnR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2gocSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eT1rO3U9bTtyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHEsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChxLDUpKyhuXnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7Cm09bSt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihtKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxxPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sWnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxrZDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17UWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sJGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCnhyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LHNuOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxhbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LEhtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sWW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5RaSgpfHxhLiRpKCl8fGEueHIoKXx8YS5VbCgpfHxhLnNuKCl8fGEuYWwoKXx8YS5IbSgpfX07cmV0dXJuIG51bGwhPWEuWW8oKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpOwp2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2ImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxmcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sVnA6ZnVuY3Rpb24oYSwKYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LGF2OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj0KYX0semc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5DYjt0aGlzLmVlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sUXQ6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJgoxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7Yi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5mcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGJ2OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9CnRoaXMuWmIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmVlKGEpfSxlZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlF0KGEpO2lmKGIpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKGIpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTWQ6ZnVuY3Rpb24oYSl7aWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLnpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuY3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8CnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMueGcoYSkpcmV0dXJuIHRoaXMueGcoYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSwKZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnNkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLm1vKGUsYSk7cmV0dXJuIGV9LGJiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIGw9ZXx8bTtlPSEwO2smJihlPSExKTtpZihsJiZsLlYpaWYobC5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLApjLGwsZyxrKX0uYmluZCh0aGlzKSw1MDApfSxraDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5czpmdW5jdGlvbihhLApiLGQpe3RoaXMua2goYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuT2MpZm9yKHZhciBjIGluIHRoaXMuT2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5PY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5iYihhLGYuTGEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnlzKGYuc2QoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEx1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LFd3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIiwKZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxhcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sWHI6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0KMDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLlZqfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLlVqPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuQ3Q9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVnM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuS3c9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi55cT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5Qdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLllmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlFmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuY289e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07CmIuaXc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlVzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnpxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Pdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLk5wPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5mZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTsKYi56Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuWGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLmZvPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5YYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLmVvPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTsKYi5Ycz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnZkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07Yi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuSnc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZXc9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmZ3PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Xcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5Vanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs2XX1jLnBqPWI7Yi5wcm90b3R5cGU9e0Z2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIGphPWMucGp8fGphLHZjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Gdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLldqPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxsYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sYXI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrCm5hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG5kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5uZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm5kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sa2E6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLmxhKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm5kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxRcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuYXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5uZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9Yy5Xanx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50cD10aGlzLmFbNV07dGhpcy5rbT10aGlzLmFbOF07dGhpcy4kbz10aGlzLmFbN107dGhpcy5OaT10aGlzLmFbOF07dGhpcy4kdz10aGlzLmFbMV07dGhpcy5sdz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs3XX0KYy5ucT1iO2IucHJvdG90eXBlPXtzcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudHA6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmttOnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbzp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmk6dGhpcy5adyhhKX0sWnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR3OnRoaXMua3coYSl9LGt3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMubnF8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLnNwKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CnZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5raj1ifSkoYyk7dmFyIEw9Yy5ranx8Ckw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ249dGhpcy5hWzddO3RoaXMuSGs9dGhpcy5hWzhdO3RoaXMuRXQ9dGhpcy5hWzddO3RoaXMubmo9dGhpcy5hWzRdO3RoaXMub3M9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbN119Yy5SaT1iO2IucHJvdG90eXBlPXtCbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ246dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkhrOnRoaXMuRHQoYSl9LER0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FdDp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubmo6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5SaXx8bGEseGM9bmV3IGxhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLkJuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuZ209TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5NYT17fTt0aGlzLkk9bnVsbDt0aGlzLkxjPTEwMDt0aGlzLkliPTA7dGhpcy5XYT0xNTA7dGhpcy5MYj0wO3RoaXMuRXUoYil9LGc6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhPyh0aGlzLkliKyssdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkxjKSk6MD50aGlzLldhJiYodGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkxjKSl9LHB1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWI+dGhpcy5XYT8hMDohMX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLkliPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKRXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuUCgpLCEwKTt0aGlzLk1hW2IubGEoKV09YjtNJiZNLmhoJiZNLmh2KGIpfSxOeDpmdW5jdGlvbigpe3JldHVybiBlLnllKHRoaXMuTWEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX0sWXI6ZnVuY3Rpb24oYil7Yj1iLkthKCk7Zm9yKHZhciBhIGluIHRoaXMuTWEpaWYoYi5pZD09dGhpcy5NYVthXS5LYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxleTpmdW5jdGlvbihiKXt0aGlzLk1hW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLmdtfHx0OyhmdW5jdGlvbihjKXtjLmltPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9CnRoaXMuaWQ9bnVsbDt0aGlzLkxjPTEwO3RoaXMuSWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubmE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkJiPSIiO3RoaXMucmc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5LYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxNOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30sT3U6ZnVuY3Rpb24oYil7dGhpcy5YPWJ9LE94OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sSHU6ZnVuY3Rpb24oYil7dGhpcy5QZT1ifSxNeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlfSxPZTpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2EmJih0aGlzLkliKyssCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTGMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sRmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sCmxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sZ3k6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMudHIoKXx8dGhpcy5pbygpO3RoaXMuRGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxQeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxpbzpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5hYSgxMCkpfSx0cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sVzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxLYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFZTpmdW5jdGlvbigpe3JldHVybiEwfSwKaXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFh4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmF9LGNhOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMH0sTWM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExoOmZ1bmN0aW9uKGIpe3RoaXMuQmI9Yn0sTHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPQpudWxsfSxSeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuQmImJihiPSEwKTtyZXR1cm4gYn0sYnk6ZnVuY3Rpb24oKXt0aGlzLnJnfHwodGhpcy5yZz0hMCl9LHZlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEl4OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLmltfHxwOyhmdW5jdGlvbihjKXtjLnVpPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5JPXRoaXMucGxheWVyPSIiO3RoaXMuTWY9IjEiO3RoaXMuTmY9IjIiO3RoaXMuV249IjMiO3RoaXMuVGM9MDt0aGlzLm9oPTMwO3RoaXMuUmI9W107dGhpcy5oYj1bXTt0aGlzLnBjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLiRmPXRoaXMuZ2k9ITE7dGhpcy5zdGF0dXM9dGhpcy5UYzsKdGhpcy5pZD1lLmFhKDEwKTt0aGlzLmhmKGIpO3RoaXMuRnUoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5naXx8KHRoaXMuZ2k9ITAsZS5NZSgpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmJjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxOcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5rYSgpXXx8KHdpbmRvd1thLmthKCldPXt9KTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldfHwod2luZG93W2Eua2EoKV1bYi5sYSgpXT17fSx3aW5kb3dbYS5rYSgpXVtiLmxhKCldLmluaXRpYXRvcj1lLlpiKCkpO3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT93aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV0rKzp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV09MX0sVnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLAphPSEwLGg9bmV3IEo7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0uaW5pdGlhdG9yIT1lLlpiKCkmJih0aGlzLmpmKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMueGEoKSl7dGhpcy5OcigpO2lmKCF0aGlzLlZyKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmpmKCk7cmV0dXJufXRoaXMuamYoKTt0aGlzLkkodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLiRoKCk7dGhpcy4kZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSx1OmZ1bmN0aW9uKGIsYSl7dGhpcy54YSgpfHwodGhpcy5SYi5wdXNoKGIpLHRoaXMuaGIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5SYiYmMDx0aGlzLlJiLmxlbmd0aCYmKHRoaXMuUmI9CmUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaGIpe2Zvcih2YXIgaD0wO2g8dGhpcy5oYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5oYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5oYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5oYltoXS5yZWFzb25dPHRoaXMucGNbYl0mJihhPVtdLGEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksYj10aGlzLmhiW2hdLnJlYXNvbik7dGhpcy5wY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LFF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZ9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxqZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTmZ9LE11OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuV259LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTWZ9LHl4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk5mfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30saGY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxGdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0sWnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxCczpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMudWl8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3A9dGhpcy5hWzZdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuJGs9dGhpcy5hWzZdO3RoaXMuYng9dGhpcy5hWzEwXTt0aGlzLmlxPXRoaXMuYVs2XTsKdGhpcy5kaj10aGlzLmFbOV07dGhpcy5keD10aGlzLmFbOV07dGhpcy5Gcj10aGlzLmFbOF07dGhpcy5mcz10aGlzLmFbM107dGhpcy5Vbz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkdtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3A6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnByOnRoaXMuWmsoYSl9LFprOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy4kazp0aGlzLmF4KGEpfSxheDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYng6dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlxOnRoaXMuY2ooYSl9LGNqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZGo6dGhpcy5jeChhKX0sY3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR4OnRoaXMuRXIoYSl9LEVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gcjp0aGlzLmVzKGEpfSxlczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5mczp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLkdtfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ucCg0KTsoZnVuY3Rpb24oYyl7Yy5Haj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Hanx8b2E7KGZ1bmN0aW9uKGMpe2MuSGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLnp4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPwoodGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuSGp8fHBhOyhmdW5jdGlvbihjKXtjLklqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pOwp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Janx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNxPXRoaXMuYVs5XTt0aGlzLnVzPXRoaXMuYVsxMF07dGhpcy5KbT10aGlzLmFbMTBdO3RoaXMuTXI9dGhpcy5hWzEwXTt0aGlzLmJ3PXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMueWw9YjtiLnByb3RvdHlwZT17QnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNxOnRoaXMudHMoYSl9LHRzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51czp0aGlzLkltKGEpfSxJbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkptOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ncjp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy55bHx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQnEoNCk7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuTXA9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMueWt8fHNhOyhmdW5jdGlvbihjKXtjLnhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UYzt0aGlzLmlzUGxheWluZz10aGlzLlZjPSExO3RoaXMuYmU9MTt0aGlzLldjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlZjPSExO3RoaXMuYmU9MTt0aGlzLldjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5NcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueWQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlZjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5XYy5pbmRleE9mKGEpJiZ0aGlzLldjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuV2MubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LEJzOmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5WY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMueGt8fHRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuV3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5ZcihoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LEt4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFdxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy56a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sdj10aGlzLmFbNV07dGhpcy52aj10aGlzLmFbOV07dGhpcy5TdD10aGlzLmFbNF07dGhpcy5waz10aGlzLmFbMV07dGhpcy51dT10aGlzLmFbMl07dGhpcy5tcz10aGlzLmFbNV07dGhpcy5Caz10aGlzLmFbNF07dGhpcy5tcT10aGlzLmFbMV07dGhpcy51bT10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVszXX1jLndqPWI7Yi5wcm90b3R5cGU9e1F2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Sdjp0aGlzLnVqKGEpfSx1ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmo6dGhpcy5SdChhKX0sUnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlN0OnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wazp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1zOgp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQms6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1xOnRoaXMudG0oYSl9LHRtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMud2p8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlF2KDQpOyhmdW5jdGlvbihjKXtjLm1uPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSwKYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5tbnx8eGE7KGZ1bmN0aW9uKGMpe2MubG49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5GYz10aGlzLkNhPXRoaXMuJGM9ITE7dGhpcy5CaD1lLkhiKDEwKTt0aGlzLmZpPSEwO3RoaXMudWM9dGhpcy5XZz0hMTt0aGlzLlRzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5yaCgpLHRoaXMudnAoKSx0aGlzLnJiKCkpfSxUczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxjeTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkubGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi4kZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkouaWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5pZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkJoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFliOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSmc6ZnVuY3Rpb24oKXtpZighdGhpcy5GYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkZjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5GYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkZjfSxXcjpmdW5jdGlvbigpe2lmKCF0aGlzLlZnKXt2YXIgYj10aGlzLnliKCksYT10aGlzLlVyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5WZz0hMCl9cmV0dXJuIHRoaXMuVmd9LFVyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuJGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLiRjPSEwKTtyZXR1cm4gdGhpcy4kY30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlliKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuaHUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksCjIwKX0saHU6ZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3ZhciBiPXRoaXMuSmcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudmM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnZjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApfSxKeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmIuYWRzJiYodGhpcy5vZz1iLmFkcyk7cmV0dXJuIHRoaXMub2d9LHZwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2EoITApO3RoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuSmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSw1MCkpfSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuV3IoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5ZYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5ZYigpLHRoaXMudWN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMueWIoKX1lbHNlIHRoaXMuV2c/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCksYj10aGlzLlliKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuV2c9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yaCgpfS5iaW5kKHRoaXMpLAo1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHdwOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud3AoKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5maT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5maSxmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sRHA6ZnVuY3Rpb24oKXt0aGlzLlN4fHwoMTA8dGhpcy53dz8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnd3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMub3UoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRHAoKX0uYmluZCh0aGlzKSwKNTApKSl9LG91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnh3KXt0aGlzLnh3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMubG58fHlhOyhmdW5jdGlvbihjKXtjLm5uPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS55ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpfX0pfSkoYyk7dmFyIHphPWMubm58fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbMTBdO3RoaXMuanA9dGhpcy5hWzRdO3RoaXMuU3I9dGhpcy5hWzZdO3RoaXMuWnM9dGhpcy5hWzVdOwp0aGlzLkFqPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs4XX1jLkx3PWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpwOnRoaXMuUnIoYSl9LFJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Tcjp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWnM6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLkx3fHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9QmMuYW4oNCk7KGZ1bmN0aW9uKGMpe2MuWWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxLdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5iYyYmKDA8PWguaW5kZXhPZihkKXx8YS55ZCgpKX0sCnBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKToKd2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuWWx8fENhOyhmdW5jdGlvbihjKXtjLlhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9CjApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5EcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLkRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuS3QoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuWGx8fERhOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLlpsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanQ9dGhpcy5hWzNdO3RoaXMuU3M9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzhdO3RoaXMueHQ9dGhpcy5hWzhdO3RoaXMucmw9dGhpcy5hWzldO3RoaXMubGw9dGhpcy5hWzddO3RoaXMuSW89dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbM119Yy5icT1iO2IucHJvdG90eXBlPXtpdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanQ6dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNzOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wbDp0aGlzLnd0KGEpfSx3dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueHQ6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLmxsOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Jbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuYnF8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLml0KDQpOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkdnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMuTXQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD0KYi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5NdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmxkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5sZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubGQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxDcDpmdW5jdGlvbigpe2UuYmgodGhpcy5sZCk7CmUuRmUodGhpcy5sZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy52a3x8SGE7KGZ1bmN0aW9uKGMpe2MudWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMudWt8fElhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkdnKGIsImVsZW1lbnRJRCIpO2lmKGUuYmgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCjEwMCl9ZWxzZSB0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLndrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuQWw9dGhpcy5hWzFdO3RoaXMuSXI9dGhpcy5hWzNdO3RoaXMueHU9dGhpcy5hWzRdO3RoaXMuRHI9dGhpcy5hWzZdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueW49dGhpcy5hWzddO3RoaXMuTW89dGhpcy5hWzVdO3RoaXMuWWs9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzVdfWMueGk9YjtiLnByb3RvdHlwZT17cXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ0OnRoaXMuemwoYSl9LHpsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWw6dGhpcy5IcihhKX0sSHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Jcjp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueHU6dGhpcy5DcihhKX0sQ3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkRyOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kbjp0aGlzLnhuKGEpfSx4bjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW46dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1vOnRoaXMuWGsoYSl9LFhrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMueGl8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnF0KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9CmE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuWGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sR3U6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxqbzpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLlhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9bmV3IHooYSkpO3ZhciBjPXRoaXMuZ2I9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTsKaWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5PZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuR3UoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLllqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9CiIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5nYi5zZW5kKGEpfWNhdGNoKGYpe20mJm0uSWUodGhpcy4kYS51cmwpP20uT2Q/bS5pYSgicmVxdWVzdF9mYWlsZWQiKToKZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuWWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17S3U6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxKdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17aXg6IkFkQ2xpY2tUaHJ1IixreDoiQWRFcnJvciIsbHg6IkFkU3RvcHBlZCIsb3g6IkFkTGluZWFyQ2hhbmdlIixweDoiQWRUYWdQYXJzZWQiLHN4OiJBZFZpZGVvQ29tcGxldGUiLAp2eDoiQWRMb2FkZWQiLHd4OiJBZFNraXBwZWQiLHh4OiJBZFN0YXJ0ZWQiLG14OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsbng6IkFkSW1wcmVzc2lvbiIsang6IkFkQ3JlYXRpdmVWaWV3IixxeDoiQWRWaWRlb01pZHBvaW50IixyeDoiQWRQYXVzZWQiLHR4OiJBZFZpZGVvU3RhcnQiLHV4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LGx1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5IYSYmdGhpcy5IYS5WZClmb3IodmFyIGIgaW4gdGhpcy5IYS5WZCl0aGlzLkhhLlZkLmhhc093blByb3BlcnR5KGIpJiYKYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMubXUoKTt0aGlzLkhhJiZ0aGlzLmx1KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuV3A9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9IiI7dGhpcy5laD0hMTt0aGlzLndhPXRoaXMucWQ9IiI7dGhpcy4kZz10aGlzLlY9dGhpcy5pc0VuYWJsZWQ9dGhpcy5hZj0hMTt0aGlzLnBhPVtdO3RoaXMuUGc9dGhpcy5nYz0iIjt0aGlzLnJlPSExO3RoaXMuc2Y9MDt0aGlzLkhmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiOwp0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuS2Q9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5FcD10aGlzLlFkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9dGhpcy53Zj10aGlzLk9kPXRoaXMubGU9dGhpcy5VYz0hMTt0aGlzLmliPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnJkPTA7dGhpcy5SZz0hMTt0aGlzLlFnPTFFMzt0aGlzLmJkPSExO3RoaXMuUWE9MUUzO3RoaXMuUGY9IiJ9Yy5aaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5XcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnFkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZyxzZXJ2ZXI6dGhpcy5wYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlBnLGRpc2FibGVDb29raWVUZXN0OnRoaXMucmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuc2YsSE9NQURfVkVSSUZJRUQ6dGhpcy5IZixIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsCkhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuS2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkVwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk9kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaWIsc2l0ZUNvbmZpZzp0aGlzLkZhLHNlcnZlcklkOnRoaXMuS2gsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmtiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5OaCx2bWFwczp0aGlzLmxpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5iZCxhZEZhbGxiYWNrVVJMOnRoaXMuUGZ9fSwKcnI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSxYcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsCmRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmFwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy54Y3x8dGhpcy53Ynx8dGhpcy53Y3x8dGhpcy5qZSkmJihnPXRoaXMuSXMoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5ZcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Cmc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LEdjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnBhJiZ0aGlzLnBhLmxlbmd0aCYmMDx0aGlzLnBhLmxlbmd0aCYmKGI9dGhpcy5wYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9CmIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuRXg7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhW3RoaXMuS2hdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxiPXRoaXMuTWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsCmIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEhzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sQz0wO0M8Zy5sZW5ndGg7QysrKXt2YXIgaz1nW0NdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMucGgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj0KdGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LElzOmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkhzKGEsdGhpcy53YykpO3JldHVybiBhfSxCcDpmdW5jdGlvbigpe3RoaXMuRmEmJnRoaXMuRmEuY2xpZW50QVBJcyYmdGhpcy54cCh0aGlzLkZhLmNsaWVudEFQSXMpfSx4cDpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuS3UoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkp1KGEucGxheWVyKTtiLmcoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLAplKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlFkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5CcCgpO3RoaXMueHMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy52cygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSx4czpmdW5jdGlvbigpe3RoaXMuRGEobmV3IHoodGhpcy5xZCt0aGlzLmdlKCJnbG9iYWwiKSksCnRoaXMubHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sdnM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5GYSYmdGhpcy5GYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuRmEmJnRoaXMuRmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxpYTpmdW5jdGlvbihhKXtpZighdGhpcy5sZSl7dGhpcy5sZT0hMDsKdmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiYKYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpO3RoaXMuTmIoKTtlLkNjKGsuQ3QpOyhiPWUuJGIodGhpcy5zZCgpKSl8fChiPWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGxyOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPQp7fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy53YX1lbHNlIGE9dGhpcy53YTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGEuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLnBhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09CnRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuS2g9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMucGEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5nYyYmdGhpcy5MYSYmdGhpcy5wYS5sZW5ndGg/dGhpcy5IYyghMSk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPQohMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTt0aGlzLkRhKGIsdGhpcy5rdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY3VzdG9tZXIiKTthP3RoaXMuRG0/dGhpcy5pYSgibm9TVk1Db25maWciKToodGhpcy5EbT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGMoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxrdjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5PZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5pYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmtjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuS2Q9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnhjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMud2I9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuY2Q9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYmQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5lcihiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMucmUmJih0aGlzLmhjPW51bGwpO3RoaXMudGY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuSHYoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuS2QpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy5ydigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnN2KCkpfX0scnY6ZnVuY3Rpb24oKXt0aGlzLnF2KCk7dGhpcy50digpfSx0djpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmEoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5rZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuVmEoKSl7aWYodGhpcy5GYSYmdGhpcy5GYS5wbGF5ZXImJnRoaXMuRmEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7CnJldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxzdjpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5VYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSxxdjpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUua2QoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmljKTsKYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy53dihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlBjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5LZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sd3Y6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMueHYoYywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlZoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSx4djpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1jO2sub25lcnJvcj1lO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy5wdi5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHB2OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5UaCgpOnRoaXMucWYoIkFBQSIpfSxUaDpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpOwp0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVWMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuSGYpKTt0aGlzLlFkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuUWQmJnRoaXMuUWQoKX0sQXA6ZnVuY3Rpb24oKXtpZih0aGlzLndmJiYKdGhpcy5ycigpKXt2YXIgYT10aGlzLlhxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnJkfHwodGhpcy5yZD0wKTt0aGlzLnJkKys7dGhpcy5yZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2MmJihhLm9pPSEwKTtxJiZlLlpyKCkmJihhLkJnPSEwKTtnJiYoYS5TaD0hMCk7cmV0dXJuIGEubG9hZCgpfSx5cDpmdW5jdGlvbigpe2UuVmEoKXx8ZS5iYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuR2MoKXx8KGE9dGhpcy56YShjKSxjPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7Zy5uZXR3b3JrU3RhdGU9PQpnLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxudjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5saX0senA6ZnVuY3Rpb24oKXt0aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnlhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMuaHcuYmluZCh0aGlzKSx0aGlzLmd3LmJpbmQodGhpcykpfSxodzpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuQXEoKX0sZ3c6ZnVuY3Rpb24oKXt9LEFxOmZ1bmN0aW9uKCl7ZS5DYyhrLnpxKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmlhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxuZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuSmIubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxIdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxlcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxjPTE0O2MtLTspZFtiW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPQphLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLlpqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5mcD10aGlzLmFbMl07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaGo9CnRoaXMuYVsxXTt0aGlzLmh0PXRoaXMuYVs4XTt0aGlzLmhzPXRoaXMuYVs1XTt0aGlzLlhtPXRoaXMuYVs3XTt0aGlzLlZ2PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzhdfWMuT2w9YjtiLnByb3RvdHlwZT17ZXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZwOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tbzp0aGlzLmdqKGEpfSxnajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaGo6dGhpcy5ndChhKX0sZ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmh0OnRoaXMuZ3MoYSl9LGdzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oczp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWG06dGhpcy5VdihhKX0sVXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5PbHx8UGEsRWM9bmV3IFBhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmVwKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy4kdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy5hZD0hMTt0aGlzLlhvPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307ZS5wYigibmV3QmlnQWRJZCIpO3RoaXMua3A9ZS5hYSgxMCk7dGhpcy5tZj0wO3RoaXMuWmM9IldlcmJ1bmcgLSBbdGltZV0iOwpjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWmM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWmM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMucG89Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkdkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5iYz0hMTt0aGlzLk9wPWUuYWEoMTApO3RoaXMuR2I9ZS5hYSgxMCk7dGhpcy5FYj1lLmFhKDEwKTt0aGlzLk9oPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLlJkPXRoaXMuT2I9dGhpcy5wZT10aGlzLmdkPXRoaXMuSWQ9CnRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubWQ9dGhpcy5Ldj10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLnhkPXt9fWMuVGo9YjtiLnByb3RvdHlwZT17QnU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLmR2KCk7ZS52KGsuZm8sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTGU6ZnVuY3Rpb24oYSxiLGMsZil7dGhpcy51Yj1jO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5BcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLG5ldyBTKHRoaXMsYSx0aGlzLm1oLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLm1jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5RYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLApjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUmQ9dGhpcy5PYj10aGlzLm1kPSExO3RoaXMuYz1hO3RoaXMuUHUodGhpcy5jKTt0aGlzLnhkPW5ldyBRYSh0aGlzLmMubncsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5IcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5IZD10aGlzLmhyKGEpKSx0aGlzLk1nKGEucGFyZW50KSl9LERnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YKYnx8KGM9dGhpcy5EZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLlNxKGEpKSk7cmV0dXJuIGN9LFNxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxocjpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxnPSIiO2lmKGEuVSl7Yj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEubGIoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpnfX0sc2E6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBiPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLmpkJiZhLmpkLmVycm9yJiZhLmpkLmVycm9yLmNvZGUmJihiPWEuamQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PQpHLlhkLmNvZGU/ZS52KGsuS3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5NZSgpLGI9PUcuS2YuY29kZSYmZS52KGsuVXMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk7ZS52KGsueXEsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmV2KCk7dGhpcy5YYSgiZW1wdHkiKTticmVhaztjYXNlIHcuSWYuY29kZTplLnYoay5pdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LkxmLmNvZGU6ZS52KGsuT3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuWWQuY29kZTplLnYoay5Qdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6ZS52KGsuVnMsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLmV3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5FZi5jb2RlOmUudihrLmZ3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuWGEoInVua25vd24iKX10aGlzLlhiKGEpO3RoaXMuUmEoKX0sWGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLlBhLmxlbmd0aDspdHJ5e3ZhciBjPWEuUGEucG9wKCk7dGhpcy5LZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sUHU6ZnVuY3Rpb24oYSl7dGhpcy5wZT0hMTt0aGlzLlBiPQp0aGlzLmIuSzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5QYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuJGU9ITB9Y2F0Y2goZil7fX1jYXRjaChlKXt9Yi5keT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsCnRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTt0aGlzLnBvJiZ0aGlzLnBsYXllci52ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuTy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5PW2NdLnR5cGUpJiZ0aGlzLmtvKGIsYS5PW2NdLnVybCsiIixhLk9bY10udHlwZSk7dGhpcy4kZSYmYi5sb2FkKCk7aWYodGhpcy5YaChiKSl7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dGhpcy5ubyhiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7CnRyeXt0aGlzLiRlP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2goayl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5LcCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuUGIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpLHRoaXMuTnUoKSk6dGhpcy5jLm9yaWdpbi51Zyh3LlVkKX0sTnU6ZnVuY3Rpb24oKXt0aGlzLkNmPSEwO3RoaXMuc2I9dGhpcy5uYz0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLm1nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5zYj0hMCk7ZS5vZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmCmUub28odGhpcy5jLm9yaWdpbi52YSk7dGhpcy5QaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9RS5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi53aCgpO3RoaXMuYi5rZigpO2ZvcihhPXRoaXMuYi5LO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIua2YoKTt0aGlzLnRhPXRoaXMuUGI9dGhpcy5iLks7dGhpcy5oaSgidnBhaWQiKTtpZih0aGlzLnNiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuS2IoIm11dGVkIiwiY29udGVudCIpO2UudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5LLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmtyKCksYz10aGlzLmMuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmRnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5oZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5iLmYuQWEmJiF0aGlzLklkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay56YywKdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuYWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuc2M9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy55dyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnp3KCksdGhpcy5iLmFjKCEwKSwhdGhpcy5PYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy5ILApjYjpmdW5jdGlvbigpe3RoaXMuUmQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuR2UodGhpcy5PYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmFjKCEwKSx0aGlzLkR3KCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5IdygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5GdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkl3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkV3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm1pKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5WYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkwuYmR8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuQXcoKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5RYyYmKHRoaXMuRGY9ITEsdGhpcy5mYygpKSx0aGlzLkJ3KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuc2I9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay52ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5zYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmhlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLmFnKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5ILCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sQXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLm5jPSEwfSxCdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlhjLHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubmM9ITF9LER3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sQ3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0senc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5RaCgpO2UudihrLlRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLllhKCJzdGFydCIpO2UudihrLlhjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubWQ9ITA7dGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLlFmLAp0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxHdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5WZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxJdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5ZYSgiY29tcGxldGUiKX0sbWk6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5YYSgidnBhaWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7CmUub2UoKTt0aGlzLkg9ITE7dGhpcy5SYShhKX19LHl3OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5Kdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubWkoITApfSxrbzpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlVhJiZiLmlzRW5hYmxlZCYmIWIuR2MoKSl7dmFyIGQ9Yi56YShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuc3cuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmMoYix0aGlzLkwpKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LG5vOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmlpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmppLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmppLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0saWk6ZnVuY3Rpb24oYSl7dGhpcy5XYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldifHx0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuWG8pKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWQmJnRoaXMuWGgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5XYil7dGhpcy5hZD0hMDt0cnl7aWYoIWUuVmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5aYSgpLCEwKSx0aGlzLkwudGd8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLnB3KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIua2YoKTt0aGlzLm93KCk7dGhpcy5oaSgpO3RoaXMuZWcoKTt0aGlzLmIud2goKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMubmYoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nZHx8dGhpcy5SZigpfSxSZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZGVvLnBsYXkoKTtpZihiJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmdkfHwoYT90aGlzLlJhKCk6KHRoaXMuUWUoITApLHRoaXMuUmYoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmVjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkxoKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuTC5rYiYmIXRoaXMuRmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5ZYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5jbyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuUmEoKX0saG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9ITEsZj0wO2Y8YS5sZW5ndGg7ZisrKWM9ZS5IZyhhW2ZdKSxiLnB1c2goYyk7YT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQSgpKTtlLmJ2KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJgp0aGlzLmMuU2QmJnRoaXMuaG8odGhpcy5jLlNkKTtpZighdGhpcy5wZSlpZih0aGlzLnBlPSEwLHRoaXMuUmR8fChlLnYoay5Ycyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy50Ynx8dGhpcy5jLnFjKXtlLnBiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm1mKys7dGhpcy5XYj10aGlzLmFkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5HZD0hMTt0cnl7dGhpcy5iLmVpKCl9Y2F0Y2goZyl7fXRoaXMuSWQ9ITA7dGhpcy5iLkJlKCk7dGhpcy5iYz0hMTt0aGlzLnhlKCkuR2goKTt0aGlzLmMudGImJnRoaXMuYy5vcmlnaW4uUmUoKTt0aGlzLmMucWMmJihhP3RoaXMuYy5vcmlnaW4ucWgoKToKdGhpcy5xZSgpKX1lbHNlIHRoaXMucWUoKX0sc3c6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5XYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkwueXAoKTt0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxqaTpmdW5jdGlvbigpe2lmKHRoaXMuS3YpdGhpcy5SYSgpO2Vsc2V7dGhpcy5iYz0hMDt0aGlzLmIuZi5BYSYmIXRoaXMuSWQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dmFyIGE9Ck1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5OdihhKTtpZighdGhpcy5PYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5SZD0hMDtlLnYoay5raSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX1jPSIiO3RoaXMuYy5sZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PaCkpJiYoYz10aGlzLmMubGYtCmEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy50Yj8odGhpcy5XYj10aGlzLmFkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5HZD0hMSx0aGlzLmIuZWkoKSx0aGlzLmMub3JpZ2luLlJlKCkpOnRoaXMuUmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWmMucmVwbGFjZSgiW3RpbWVdIiwKZS5DZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmZlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxiaTpmdW5jdGlvbigpe3RoaXMudmh8fCh0aGlzLnZoPSEwLHRoaXMubWR8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxOdjpmdW5jdGlvbihhKXtlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuY2l8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYmkoKX0uYmluZCh0aGlzKSksdGhpcy5GYnx8dGhpcy5RaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLAp0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5rYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5UZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMubWQ9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLnYoay5RZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi8yKSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuWmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5jaT1hKX0sUGg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsYiwhMCl9LGR2OmZ1bmN0aW9uKCl7ZS5NZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxRaDpmdW5jdGlvbigpe2UuTWQoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0sZXY6ZnVuY3Rpb24oKXtlLk1kKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sClhhOmZ1bmN0aW9uKGEpe2UuTWQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuTC5rYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxLYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5rYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkZiKXt0aGlzLnhkJiZ0aGlzLnhkLnRyYWNrJiZ0aGlzLnhkLnRyYWNrKGEpO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLmlyKHRoaXMuYy5QYSxhKX1jYXRjaChmKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgZz1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmCih0aGlzLmtlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmUuWHIoZy51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZW8sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLktlKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmMuUGE9dGhpcy5VcCh0aGlzLmMuUGEsYSl9Y2F0Y2gobSl7fX19LFphOmZ1bmN0aW9uKCl7dmFyIGE9ZS5WYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixiPSIiO3RoaXMuQ2YmJihiPSJfdnBhaWQiKTt0aGlzLlFjJiYoYj0iX3dlbGVjdCIpO3JldHVybiBhK2J9LEtlOmZ1bmN0aW9uKGEsYixjLGYsZSl7YSYmInN0cmluZyI9PQp0eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxjJiZiLmpvKGMpLGZ8fChmPXRoaXMuc2cpLGV8fChlPXRoaXMuc2cpLHRoaXMubG8oYSksdGhpcy5MLkRhKGIsZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGxvOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09Im9wZW4ifSxGaDpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJjbG9zZWQifSxIcDpmdW5jdGlvbigpe3RoaXMuZGM9e319LGd2OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuZGMpdGhpcy5kYy5oYXNPd25Qcm9wZXJ0eShiKSYmIm9wZW4iPT10aGlzLmRjW2JdJiZhKys7cmV0dXJuIGF9LGlyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sVXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpifSl9LHB3OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5xdy5iaW5kKHRoaXMpKX0scXc6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmZjKCk6dGhpcy5jLlZiJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5MLmJkfHx0aGlzLlFjKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLlZifWNhdGNoKGMpe3dpbmRvdy5vcGVuKHRoaXMuYy5WYixhKX19LmJpbmQodGhpcyksNTAwKSl9LApvdzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlpjLnJlcGxhY2UoIlt0aW1lXSIsZS5DZygwKSk7CnZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5jZCYmKGI9dGhpcy5MLmNkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5jZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sRWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5jZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGhpOmZ1bmN0aW9uKGEpe2lmKCFlLm9mKHRoaXMuY29udHJvbHMpKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpjLmlkPXRoaXMuT3A7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuR2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkViO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Ndi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkx2LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk9oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmMuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmxmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXt0aGlzLkJhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLm1nLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGZjOmZ1bmN0aW9uKCl7dGhpcy5CYSYmImJsb2NrIj09dGhpcy5CYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxZaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuWGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxaaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMubmM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLm5jPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLm5jPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5YYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LEx2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxNdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuc2I/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5zYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMuc2I9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSwkdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsudmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmVjKTt0aGlzLmdkfHx0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0scWU6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUua2QoKTshdGhpcy5MLm1jfHxlLlZhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5rZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy50aHx8IXRoaXMuTC5VYyYmInNwaWVnZWwuZGUiIT1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwicHJlcm9sbCIhPWUuQ2I/KHRoaXMuZ2Q9ITAsdGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy5uZygpKToodGhpcy50aD10aGlzLlFjPXRoaXMuRGY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5rZT0hMCxhPWUuZGcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuTGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuZ3YoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy5JZD0hMCx0aGlzLmIuQmUoKSx0aGlzLmIucXUoKSx0aGlzLmJjPSExLAplLnYoay5OcCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMueGUoKS5HaCgpKX0seGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZWc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZS5GZSh0aGlzLnZpZGVvLGEpP3RoaXMuSWgoKTp0aGlzLnlkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVmIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5zYyYmMDx0aGlzLnNjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5zYykpO3RoaXMudmlkZW8mJgp0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMua3ArIi0iK3RoaXMubWY7dGhpcy5jJiZ0aGlzLmMuSWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLklnKCkpO3JldHVybiBhfSxzZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuVGp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRwPXRoaXMuYVsyXTt0aGlzLm50PXRoaXMuYVs4XTt0aGlzLll3PXRoaXMuYVsxXTt0aGlzLm5rPXRoaXMuYVsxMF07dGhpcy5raz10aGlzLmFbNV07dGhpcy5Vbj10aGlzLmFbNV07dGhpcy5Bbj10aGlzLmFbNl07dGhpcy5lbj10aGlzLmFbMV07dGhpcy52cj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLkJpPWI7Yi5wcm90b3R5cGU9CntTcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVHA6dGhpcy5tdChhKX0sbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm50OnRoaXMuWHcoYSl9LFh3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Zdzp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubms6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmtrOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Vbjp0aGlzLnpuKGEpfSx6bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQW46dGhpcy5kbihhKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVuOnRoaXMudXIoYSl9LHVyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuQml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5TcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkdhPW51bGw7dGhpcy5ZPVtdO3RoaXMuVT1udWxsO3RoaXMucmM9dGhpcy50Yz0hMTt0aGlzLnZhPSIiO3RoaXMuQmY9ITE7dGhpcy5UZz0iIjtkJiZkLmVtcHR5P3RoaXMuQXMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5rbj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5rZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPQohMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bS55YShtLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuVmEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlKXthPWUucGcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uSmQoYSkpKyImdHlwZT1qcyIsYj1tLnlhKG0uSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0ueWEobS5KZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnpzLmJpbmQodGhpcyksdGhpcy53cy5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD8KW106W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkdhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5DYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmCihiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuQ2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkNifHx0aGlzLmJzKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLm52KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGJzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYKKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0senM6ZnVuY3Rpb24oYSl7dGhpcy5adChhKTt0cnl7dGhpcy5HYT1hLnJlc3BvbnNlWE1MLHRoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOgpHLkpmfSkpfSxBczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWWQpKX10aGlzLlk9dGhpcy5FZygpO3RoaXMudGM9dGhpcy5yZigpO3RoaXMucmM9dGhpcy5VaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5KYygpOnRoaXMuc2EodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkJmP0cuWGQ6Ry5KZn0pKX0sd3M6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5JZix7ZGVwdGg6YX0pKX0sSmM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5kcygpP3RoaXMueXYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMuUnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMuY3coKSYmdGhpcy5XZSh0aGlzLlJwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPwoodGhpcy50Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5SZSgpfSxxaDpmdW5jdGlvbigpe3RoaXMucmM/KHRoaXMucmM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSmMoKSk6dGhpcy5wYXJlbnQucWgoKX0sY3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52digpP3RoaXMudXYoKT8hMDooLTEhPXRoaXMuRGMoKT90aGlzLnNhKHRoaXMuU2Eody5UZCkpOnRoaXMuc2EodGhpcy5TYSh3LkVmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5TYyxHLktmKSksITEpfSxXZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5TZHx8KGEuU2Q9W10pO2EuU2QucHVzaCh0aGlzLlRnKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuQWc7dGhpcy5wYXJlbnQuV2UoYSl9LFJwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuRGMoKTthLk89dGhpcy5LZygpO2EuVmI9dGhpcy5UcSgpO2Eubnc9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5RcSgpO2EubGY9dGhpcy5ncihhLmR1cmF0aW9uKTthLmFiPWEuYWI/YS5hYjotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuQWc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLmFiPWIuYWI/Yi5hYjotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuQWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlVxKCkpOmIuUGEuY29uY2F0KHRoaXMuYnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5YYiYmdGhpcy5wYXJlbnQuWGIoYiksYT0wLHRoaXMuSmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxYYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5YYihhKX0sdWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30seXY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSx2djpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuS2coKS5sZW5ndGh9LHV2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSxVaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxadDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuQmY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sZHM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk5nKCkubGVuZ3RofSxOZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LFJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5sYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuYWgoYS5wYXJlbnROb2RlKTohMX0sYnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sVXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFRxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxGeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5wZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxncjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLmF2KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5wZChhKToiIn0scGQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLmtufHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp2PXRoaXMuYVs1XTt0aGlzLm5tPXRoaXMuYVsxXTt0aGlzLmlsPXRoaXMuYVs4XTt0aGlzLnhsPXRoaXMuYVs3XTt0aGlzLlJ3PXRoaXMuYVsxMF07dGhpcy5ObD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs5XX1jLlBxPWI7Yi5wcm90b3R5cGU9e0l2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kdjp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5obChhKX0saGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlsOnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54bDoKdGhpcy5RdyhhKX0sUXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJ3OnRoaXMuTWwoYSl9LE1sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLlBxfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Jdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5mbT1iO2IucHJvdG90eXBlPXtLcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSwkcTpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy4kcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sa3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmZtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5UaT10aGlzLmFbOF07dGhpcy5Paz10aGlzLmFbOV07dGhpcy5lbT0KdGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzZdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuZ2s9dGhpcy5hWzRdO3RoaXMuenQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5adj1iO2IucHJvdG90eXBlPXtTaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVGk6dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk9rOnRoaXMuZG0oYSl9LGRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lbTp0aGlzLkN2KGEpfSxDdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHY6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nazp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuenQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlp2fHxXYSxIYz1uZXcgV2EoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuU2koNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApneDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGh4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlB2PXRoaXMuYVs4XTt0aGlzLlZtPXRoaXMuYVs3XTt0aGlzLkRvPXRoaXMuYVsxMF07dGhpcy5QaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLkV2PWI7Yi5wcm90b3R5cGU9e092OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qdjp0aGlzLlVtKGEpfSxVbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVm06dGhpcy5DbyhhKX0sQ286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkRvOnRoaXMuT2koYSl9LE9pOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuRXZ8fFhhLEljPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk92KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj0KYTt0aGlzLmpkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuRmo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkZqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KaT10aGlzLmFbMV07dGhpcy5VdD10aGlzLmFbN107dGhpcy53aT10aGlzLmFbMV07dGhpcy5jbT10aGlzLmFbNl07dGhpcy5VdT10aGlzLmFbNl07dGhpcy5HbD10aGlzLmFbMTBdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuUHI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy54bT1iO2IucHJvdG90eXBlPXtJaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSmk6dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VdDp0aGlzLnZpKGEpfSx2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5ibShhKX0sYm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5jbTp0aGlzLlR1KGEpfSxUdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXU6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkdsOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50azp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUHI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLnhtfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5JaSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSGg9YTt0aGlzLnZpZGVvPWI7dGhpcy5QZD1bXTt0aGlzLkVoPVtdO3RoaXMuU2U9W107dGhpcy5ydz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLmpsPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLiR4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm51LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmZ1LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwpsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuUGQucHVzaCh7c3JjOmMsZnJhbWU6ZyxCdDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5TZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlNlW2JdO2MudHlwZT09PWEmJmMudXAodGhpcy5WcShhKSl9fSxWcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpeTohMCxoeTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntXeDoidmlkZW8iLGt5OiJqc0N1c3RvbSIsbHk6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbXk6MSxHeDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LGpyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5QZC5sZW5ndGg7YisrKWlmKHRoaXMuUGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5QZFtiXS5CdDtyZXR1cm4iIn0sbnU6ZnVuY3Rpb24oYSxiKXt0aGlzLkVoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLmpyKGIpLHZlbmRvcjpifSk7CnRoaXMuY3YoKX0sZnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnJ3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSx1cDpiLGZ5OiExfSl9LGN2OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS4kcnx8KGEuWngoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmp5LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS4kcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5qbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmo9dGhpcy5hWzEwXTt0aGlzLm5sPXRoaXMuYVsxXTt0aGlzLlNrPQp0aGlzLmFbNV07dGhpcy5Ecz10aGlzLmFbNV07dGhpcy5ncT10aGlzLmFbMl07dGhpcy52bD10aGlzLmFbM107dGhpcy5zbT10aGlzLmFbMl07dGhpcy5DbT10aGlzLmFbM107dGhpcy5Tbj10aGlzLmFbNF07dGhpcy5Raz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLkdzPWI7Yi5wcm90b3R5cGU9e2FqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5iajp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmw6dGhpcy5SayhhKX0sUms6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNrOnRoaXMuQ3MoYSl9LENzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy51bChhKX0sdWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52bDp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNtOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuQ206dGhpcy5SbihhKX0sUm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNuOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Razp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFphPWMuR3N8fFphLEtjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLmFqKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMuZj1hO3RoaXMuamI9YS5GZygpO3RoaXMuSz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLksuaWQ9ZS5hYSgxMCk7dGhpcy5GPUUucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5jZz0hMTt0aGlzLlRiPVtdfWMub2o9YjtiLnByb3RvdHlwZT17T3E6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5PcShhKTtmb3IodmFyIGI9MCxjPTAsZT0hMSxnPXRoaXMud3IoYSksaz17fTthOyliKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGp2OmZ1bmN0aW9uKCl7dGhpcy5jZz0hMH0sZWk6ZnVuY3Rpb24oKXt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LAp3aDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLnpjLHRoaXMuZi5zKCkpfSxxdTpmdW5jdGlvbigpe3RoaXMuY2d8fCh0aGlzLmYucGxheSgpLGUudihrLmZkLHRoaXMuZi5zKCkpKX0sa2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuSy5zdHlsZS56SW5kZXg9YTt0aGlzLksuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5LLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLksuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLksuc3R5bGUuYm94U2l6aW5nPXRoaXMuamIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSy5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PXRoaXMuamIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5qYik7dGhpcy5mLk1jJiZ0aGlzLmYuTWMoKT90aGlzLmYuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5LKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSx3cjpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGImJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sSXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249CmIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sYWM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JcSh0aGlzLmpiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkJlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5NYygpPyh0aGlzLksuc3R5bGUubGVmdD0iMHB4Iix0aGlzLksuc3R5bGUudG9wPSIwcHgiKToodGhpcy5LLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5LLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5LLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KwoicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLm9mKHRoaXMuSykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGFnOmZ1bmN0aW9uKGEpe3RoaXMuVGJ8fCh0aGlzLlRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5UYi5wdXNoKGEpfSxCZTpmdW5jdGlvbigpe3RoaXMuSyYmdGhpcy5LLnBhcmVudE5vZGUmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkspO3RoaXMuRiYmdGhpcy5GLnBhdXNlJiZ0aGlzLkYucGF1c2UoKX19fSkoYyk7Zm9yKHZhciAkYT1jLm9qfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtFLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FbD10aGlzLmFbN107dGhpcy54cT10aGlzLmFbMV07dGhpcy55bz10aGlzLmFbMV07dGhpcy5MbD10aGlzLmFbNF07dGhpcy5ycT10aGlzLmFbM107dGhpcy5Odz10aGlzLmFbMl07dGhpcy5Hbz10aGlzLmFbMV07dGhpcy5haz10aGlzLmFbNF07dGhpcy51bj10aGlzLmFbNl07dGhpcy5qPQp0aGlzLmFbMl19Yy5ocD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWw6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhxOnRoaXMueG8oYSl9LHhvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55bzp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGw6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJxOnRoaXMuTXcoYSl9LE13OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Odzp0aGlzLkZvKGEpfSxGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR286dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFrOnRoaXMudG4oYSl9LHRuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJiPWMuaHB8fGJiLExjPQpuZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5EbCg0KTsoZnVuY3Rpb24oYyl7Yy5TbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5XKGEpO3RoaXMuRGQoYik7dGhpcy5xZygpfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0scWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkthKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLAphP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sRWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5LYSgpOwppZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLlNsfHxjYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuVWY9dGhpcy5XZj10aGlzLlhnPXRoaXMuZWE9dGhpcy51Zj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLkVxKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51Zj0hMDt0aGlzLlhnJiZ0aGlzLmtnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsCiJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJmEuYmMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuWGc9ITA7dGhpcy5rZygpfS5iaW5kKHRoaXMpKTt0aGlzLmdnKCl9LGtnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Ipe3RoaXMuZGQoKTtpZighdGhpcy51ZiYmIXRoaXMuZGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnVmJiZ0aGlzLlVmJiYhdGhpcy5XZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGRkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpOwpyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sTGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sZ2c6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPXRoaXMuTGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5XZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlVmPWIuRHh9dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSxIeDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5VeCgpOiExfSxEYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkRjKCk6LTF9LGNyOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LEVxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlNifHwzMDI9PXRoaXMuU2I/dGhpcy5lYT0hMDp0aGlzLnUoImFkZXJyb3IiLHRoaXMuU2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOmIuRWUoKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5jcihiKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksCjJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy5SbHx8ZGI7KGZ1bmN0aW9uKGMpe2MuVGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxhczpmdW5jdGlvbigpe3dpbmRvdy5PTy5sbS5Ybi5Wbj93aW5kb3cuT08ubG0uWG4uVm4uQngoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYXMoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS55ZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgY2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IGRiKGMsCnRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy5UbHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ0PXRoaXMuYVs1XTt0aGlzLnZ3PXRoaXMuYVs4XTt0aGlzLllwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzhdfWMuYXE9YjtiLnByb3RvdHlwZT17YXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJ0OnRoaXMudXcoYSl9LHV3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52dzp0aGlzLlhwKGEpfSxYcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWXA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLmFxfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuYXQoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLnpoKCl9LHpoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ZaXx8aGI7KGZ1bmN0aW9uKGMpe2MuWGk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0saGc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucmEoKTp0aGlzLm0oKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuaGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sQ2g6ZnVuY3Rpb24oYil7Yj1uZXcgaGIoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fChiLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlIoYiksKG5ldyBpYihiLHRoaXMuSSkpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkZxfHwodGhpcy5GcT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuQ2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLkNoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7CnRoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuWml8fGpiLFQ9bmV3IGpiKHIpO1QuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZ3PXRoaXMuYVsxXTt0aGlzLlFsPXRoaXMuYVsxXTt0aGlzLnFzPXRoaXMuYVs2XTt0aGlzLkF2PXRoaXMuYVsxMF07dGhpcy5paz10aGlzLmFbMV07dGhpcy5ycD10aGlzLmFbOV07dGhpcy5idT10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLkFpPWI7Yi5wcm90b3R5cGU9e1V3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Wdzp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFsOnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xczp0aGlzLnp2KGEpfSx6djpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQXY6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5pazp0aGlzLnFwKGEpfSxxcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJwOnRoaXMuYXUoYSl9LGF1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5idTp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkFpfHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5Vdyg0KTsoZnVuY3Rpb24oYyl7Yy5ObT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuTm18fFU7KGZ1bmN0aW9uKGMpe2MuTW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guWWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlljKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuJHMoYSl9LmJpbmQodGhpcykpO3guWWMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5ZYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3gucXIoKX0sJHM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwKMzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLk1tfHxWOyhmdW5jdGlvbihjKXtjLk9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTsKdGhpcy53ZCYmKGI9ZS5WcChiLHRoaXMud2QpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLndkfHwodGhpcy53ZD1bXSksdGhpcy53ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWWM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8Cih0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LEJ2OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5wdSgpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxxcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9CmEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5CdihiKX19KX0pKGMpO3ZhciBsYj1jLk9tfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpuPXRoaXMuYVsxXTt0aGlzLldrPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMudHc9YjtiLnByb3RvdHlwZT17aG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuVmsoYSl9LFZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuV2s6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYj1jLnR3fHxtYixPYz1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy5obig0KTsoZnVuY3Rpb24oYyl7Yy5VaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxBYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuVWl8fG5iOyhmdW5jdGlvbihjKXtjLlZpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMudSgibm9BZCIsInBsYXllZCIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLlZpfHxvYjsoZnVuY3Rpb24oYyl7Yy5XaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpOwppZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBuYihkKTt0aGlzLk4oZyl8fCh0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLldpfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1wPXRoaXMuYVs1XTt0aGlzLmVxPXRoaXMuYVs3XTt0aGlzLkp0PXRoaXMuYVs0XTt0aGlzLlVrPXRoaXMuYVs2XTt0aGlzLmduPXRoaXMuYVs4XTt0aGlzLndtPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuUXU9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1wOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lcTp0aGlzLkl0KGEpfSxJdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSnQ6dGhpcy5UayhhKX0sVGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVrOnRoaXMuZm4oYSl9LGZuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbjp0aGlzLnZtKGEpfSx2bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj0KYy5RdXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMubHAoNCk7KGZ1bmN0aW9uKGMpe2MuSWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuZXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZXU6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJgphLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFlnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMuSWx8fHNiOyhmdW5jdGlvbihjKXtjLkhsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLkhsfHx0YjsoZnVuY3Rpb24oYyl7Yy5KbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9CmwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5KbHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZmo9dGhpcy5hWzddO3RoaXMuUHM9dGhpcy5hWzNdO3RoaXMuc3U9dGhpcy5hWzZdO3RoaXMuZng9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMl19Yy5Hcj1iO2IucHJvdG90eXBlPXtlajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmo6dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBzOgp0aGlzLnJ1KGEpfSxydTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnN1OnRoaXMuZXgoYSl9LGV4OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5meDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuR3J8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmVqKDQpOyhmdW5jdGlvbihjKXtjLnFuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMucW58fAp3YjsoZnVuY3Rpb24oYyl7Yy5wbj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxZYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sY3U6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5jdSh0aGlzLkNhKToodGhpcy5DYT10aGlzLlliKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpO3JldHVybn1pZighdGhpcy51Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZiLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmZiW2FdJiYzMDMhPXRoaXMuZmJbYV0mJjQwMyE9dGhpcy5mYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKNTAwKX19KX0pKGMpO3ZhciB4Yj1jLnBufHx4YjsoZnVuY3Rpb24oYyl7Yy5ybj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMucm58fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MbT10aGlzLmFbMV07dGhpcy5HcD10aGlzLmFbMV07dGhpcy5SbT10aGlzLmFbOV07dGhpcy5Rbj10aGlzLmFbOV07CnRoaXMua3E9dGhpcy5hWzEwXTt0aGlzLnp1PXRoaXMuYVs2XTt0aGlzLnVvPXRoaXMuYVsyXTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzJdfWMuY249YjtiLnByb3RvdHlwZT17S206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxtOnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HcDp0aGlzLlFtKGEpfSxRbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUm06dGhpcy5QbihhKX0sUG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlFuOnRoaXMuanEoYSl9LGpxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcTp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuenU6dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVvOnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT8KdGhpcy5qOmF9fX0pKGMpO3ZhciBBYj1jLmNufHxBYixSYz1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1SYy5LbSg0KTsoZnVuY3Rpb24oYyl7Yy56bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVyhiKTt0aGlzLlooYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5YZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuTHQoKX0uYmluZCh0aGlzKSw1MDApfSxMdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJgphJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5YZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5YZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxmdjpmdW5jdGlvbigpe3RoaXMuWGU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBCYj1jLnptfHxCYjsoZnVuY3Rpb24oYyl7Yy55bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubGM9MH0sZzpmdW5jdGlvbigpe3RoaXMuRnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmxjfHwodGhpcy5sYz0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKToodGhpcy5sY3x8dGhpcy5sYysrLHRoaXMubGM8PXRoaXMuRnM/KHRoaXMubGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLmZ2KCksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBDYj1jLnltfHxDYjsoZnVuY3Rpb24oYyl7Yy5BbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgQmIod2luZG93LnBsYXllckFwaSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgQ2IoYix0aGlzLkkpKS5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBEYj1jLkFtfHxEYixFYj1uZXcgRGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnE9dGhpcy5hWzZdO3RoaXMubHQ9dGhpcy5hWzNdO3RoaXMuSGk9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy50dD1iO2IucHJvdG90eXBlPXt1cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnE6dGhpcy5rdChhKX0sa3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmx0OnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLnR0fHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1TYy51cSg0KTsoZnVuY3Rpb24oYyl7Yy5wbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBHYj1jLnBtfHxHYjsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzsKYSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLkxwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMub2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnNzKCk6dGhpcy5qZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZigpfHwodGhpcy51KCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LExwOmZ1bmN0aW9uKCl7dGhpcy5TZigpfHx0aGlzLm0oITApfSxzczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm9kKCk7IWIucWEmJmIuWSYmYi5BeCYmYi5DeCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoKX0uYmluZCh0aGlzKSwxMDApfSxvZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVoKWZvcih2YXIgYj1sLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLmlkLApjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudWg9YltjXSk7cmV0dXJuIHRoaXMudWh9LFZ4OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLm9kKCkuYWRzTG9hZGVyP3RoaXMuRyghMCk6dGhpcy5HKCk6dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEhiPWMub218fEhiOyhmdW5jdGlvbihjKXtjLnFtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwucGxheWVyYXBpKXt2YXIgYj1sLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgSGIoYyx0aGlzLkkpKS5nKCkpfXJldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgSWI9Yy5xbXx8SWIsSmI9bmV3IEliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNqPXRoaXMuYVszXTt0aGlzLnduPXRoaXMuYVs0XTt0aGlzLlNqPXRoaXMuYVs1XTt0aGlzLktxPXRoaXMuYVs2XTt0aGlzLkRpPXRoaXMuYVs4XTt0aGlzLnNvPXRoaXMuYVs3XTt0aGlzLldvPXRoaXMuYVs2XTt0aGlzLnppPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzZdfWMucnM9YjtiLnByb3RvdHlwZT17Qmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNqOnRoaXMudm4oYSl9LHZuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud246dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNqOgp0aGlzLkpxKGEpfSxKcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS3E6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRpOnRoaXMucm8oYSl9LHJvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zbzp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV286dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56aTp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRGs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnJzfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5Caig0KTsoZnVuY3Rpb24oYyl7Yy5mbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxUeDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxNYzpmdW5jdGlvbigpe3JldHVybiEwfSxLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9CmMuZmx8fFg7KGZ1bmN0aW9uKGMpe2MuZGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlllJiZiIT10aGlzLlllfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLmF5KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYKKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuZGx8fFk7KGZ1bmN0aW9uKGMpe2MuZ2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5uYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuZ2x8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY2s9dGhpcy5hWzEwXTt0aGlzLiRwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuRW89YjtiLnByb3RvdHlwZT17Yms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmNrOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuRW98fE5iLFVjPW5ldyBOYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5iayg0KTsoZnVuY3Rpb24oYyl7Yy5Qaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LEF1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LApBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5Qanx8T2I7KGZ1bmN0aW9uKGMpe2MuT2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5Panx8UGI7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpOwp2YXIgUWI9Yy5Ranx8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs2XTt0aGlzLkZtPXRoaXMuYVsyXTt0aGlzLmNsPXRoaXMuYVsxXTt0aGlzLlN1PXRoaXMuYVs2XTt0aGlzLld0PXRoaXMuYVs0XTt0aGlzLldsPXRoaXMuYVs3XTt0aGlzLnZ0PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzZdfWMuRnQ9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRsOnRoaXMuRW0oYSl9LEVtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GbTp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5SdShhKX0sUnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlN1OnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV3Q6dGhpcy5WbChhKX0sClZsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbDp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLkZ0fHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Fbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSwKTmQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LGR1OmZ1bmN0aW9uKCl7dGhpcy5SYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJjfHwodGhpcy5SYz0hMCx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5OZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxBYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuRW58fFRiOyhmdW5jdGlvbihjKXtjLkRuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LERoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSwKYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VYihhKX0uYmluZCh0aGlzKSkpLGImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5EaC5iaW5kKHRoaXMpLDEwKX0sVWI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT0KYS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxPZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5VYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuT2YoKTt0aGlzLmd1KCl9LGd1OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGIpe3RoaXMuVWIoYil9KX0sbTpmdW5jdGlvbihiKXt0aGlzLiR0P3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihiKXt0aGlzLiR0PSEwO2lmKGImJmIuZGV0YWlsKWZvcih2YXIgYSBpbiBiLmRldGFpbCkiYWRUYWdVcmwiPT1hJiYoYi5kZXRhaWxbYV18fHRoaXMuVWIoYikpfX0pfSkoYyk7dmFyIFViPWMuRG58fFViOyhmdW5jdGlvbihjKXtjLkZuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIuZHUoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpOwp2YXIgVmI9Yy5Gbnx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rcz10aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLlluPWI7Yi5wcm90b3R5cGU9e2pzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLllufHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy5qcyg0KTsoZnVuY3Rpb24oYyl7Yy5abT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLnhoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT0KYi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLk5zPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxBdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTnN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy54aCYmCih0aGlzLnhoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy5abXx8TzsoZnVuY3Rpb24oYyl7Yy5ZbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuTXUoKTp0aGlzLm0oITApLCEwO3RoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubSgpOnRoaXMubSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnVlPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlM9CnRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLlltfHxQOyhmdW5jdGlvbihjKXtjLiRtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwKKHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuY2YoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLiRtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMucms9dGhpcy5hWzZdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbNF19Yy5Xdj1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSHQ6CnRoaXMucWsoYSl9LHFrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5yazp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Xdnx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuR3QoNCk7KGZ1bmN0aW9uKGMpe2MuSms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Ka3x8WjsoZnVuY3Rpb24oYyl7Yy5Jaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy5yYigpLCEwO3RoaXMuVWcrKztpZigxMDx0aGlzLlVnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0KITB9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLklrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Laz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLktrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY3A9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzldO3RoaXMuTm49dGhpcy5hWzZdO3RoaXMuS3I9dGhpcy5hWzVdO3RoaXMuSG49dGhpcy5hWzRdO3RoaXMucHE9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5saz1iO2IucHJvdG90eXBlPXticDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY3A6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5lazp0aGlzLk1uKGEpfSxNbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTm46dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktyOnRoaXMuR24oYSl9LEduOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Ibjp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucHE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLmxrfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5icCg0KTsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJgphPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Nanx8ZGM7KGZ1bmN0aW9uKGMpe2MuTGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaWcoKX0saWc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLkxqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Oaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLk5qfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHQ9dGhpcy5hWzldO3RoaXMucmo9dGhpcy5hWzZdO3RoaXMuQnI9dGhpcy5hWzNdO3RoaXMuS3M9dGhpcy5hWzNdO3RoaXMuV3U9dGhpcy5hWzEwXTt0aGlzLkpuPXRoaXMuYVs1XTt0aGlzLnB0PXRoaXMuYVs2XTsKdGhpcy5qPXRoaXMuYVsxMF19Yy5zdD1iO2IucHJvdG90eXBlPXtjdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZHQ6dGhpcy5xaihhKX0scWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnJqOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ccjp0aGlzLkpzKGEpfSxKczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3M6dGhpcy5WdShhKX0sVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLld1OnRoaXMuSW4oYSl9LEluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kbjp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucHQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLnN0fHxoYyxaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9WmMuY3QoNCk7KGZ1bmN0aW9uKGMpe2Mucmk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMucml8fGljOyhmdW5jdGlvbihjKXtjLnBpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGZnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5mZy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnBpfHxqYzsoZnVuY3Rpb24oYyl7Yy5zaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9Cm5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnNpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQW89dGhpcy5hWzJdO3RoaXMuRWo9dGhpcy5hWzRdO3RoaXMuQ2w9dGhpcy5hWzhdO3RoaXMuVG09dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzddO3RoaXMuaj0KdGhpcy5hWzNdfWMuUXM9YjtiLnByb3RvdHlwZT17em86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkFvOnRoaXMuRGooYSl9LERqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Fajp0aGlzLkJsKGEpfSxCbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2w6dGhpcy5TbShhKX0sU206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRtOnRoaXMuSm8oYSl9LEpvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1jPWMuUXN8fG1jLCRjPW5ldyBtYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLnpvKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdOwp0aGlzLmJmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpiP251bGw6SmIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj8KbnVsbDpSYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcWI/bnVsbDpxYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIEViP251bGw6RWIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGxjP251bGw6bGMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLmhtPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuZHIoYSk6W10sYjt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107CnRoaXMueGYoYikmJih0aGlzLnpkLnB1c2goYiksdGhpcy5KaChiKSl9fSx4ZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLmJmW2NdLHRoaXMueGYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sSmg6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5nKCl9LGh2OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG5jPWMuaG18fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5RcD10aGlzLmFbMV07dGhpcy5Gaz10aGlzLmFbN107dGhpcy5NcT10aGlzLmFbMTBdO3RoaXMuTXM9dGhpcy5hWzddO3RoaXMuWXU9dGhpcy5hWzZdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMueWo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5ncD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUXA6dGhpcy5FayhhKX0sRWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZrOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5NcTp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTXM6dGhpcy5YdShhKX0sWHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLll1OnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cjp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5ncHx8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9YWQuUHAoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQ2Moay5kdyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywKITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkNjKGsuV3MpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgYmQ9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLlpnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWmcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTsKSS5rYSgpO3ZhciBjZD1iZChmdW5jdGlvbigpe2Uuemcod2luZG93LEkuUXIoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhxPXRoaXMuYVs3XTt0aGlzLll2PXRoaXMuYVs0XTt0aGlzLmJvPXRoaXMuYVszXTt0aGlzLm5yPXRoaXMuYVs3XTt0aGlzLmpqPXRoaXMuYVs0XTt0aGlzLlFvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMuQm89YjtiLnByb3RvdHlwZT17R3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuWHYoYSl9LFh2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zdjp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYm86dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5yOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuamo6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5Cb3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuR3EoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnloPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy51ZD0wO3RoaXMuZWI9IiI7dGhpcy5BZD1bXTt0aGlzLkJkPTA7dGhpcy5BaD0hMTt0aGlzLlplPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnRpPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3RoaXMueWg9YX0saGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKRHU6ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBifSxOYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5iYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLlRyKCkpdGhpcy5uYi5sKHRoaXMubmIucWQsCnRoaXMubmIud2EsdGhpcy5uYi5hZixmdW5jdGlvbigpe3RoaXMuTmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm5iLkJjKTtlbHNlIGlmKHRoaXMuc3IoKSl0aGlzLnZ1KGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmp2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucGIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm5iLGcpO2wuQnUodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkVzKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJgooYz10aGlzLnBsYXllci5KZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5MZShhLGMsZik7dGhpcy5wbGF5ZXIuTGgobCl9fSxUcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnVkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yj8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LCR1OmZ1bmN0aW9uKCl7ZS5wYigicHJlcm9sbCIpO2UuZ2YoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX0sWnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueWgpe2UuZ2YoInBvc3Ryb2xsIik7ZS5wYigicG9zdHJvbGwiKTt0aGlzLkl1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnZnKGMpKT90aGlzLk5jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LGp1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuT3UodGhpcy5adS5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuTmEoKX0sRmQ6ZnVuY3Rpb24oYSl7ZS5wYigibWlkcm9sbCIpO2UuZ2YoIm1pZHJvbGwiKTtpZighdGhpcy5uaCl7dGhpcy5uaD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5OYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX19LGl1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHUodGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy4kdSgpO3RoaXMucGxheWVyLk9lJiZ0aGlzLml1KCk7dGhpcy5qdSgpfSxrdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5BZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuV3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxzcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSx2dTpmdW5jdGlvbihhKXt0aGlzLkFoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuUHQuYmluZCh0aGlzKSl9LFB0OmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLlplLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy5BaCgpfSxFczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5aZS5sZW5ndGg7YysrKWI9CnRoaXMuWmVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubXY9dGhpcy5hWzRdO3RoaXMuS2o9dGhpcy5hWzNdO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnRxPXRoaXMuYVs1XTt0aGlzLlR3PXRoaXMuYVszXTt0aGlzLmZ0PXRoaXMuYVs4XTt0aGlzLlR2PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzldfWMuUG09YjtiLnByb3RvdHlwZT17bHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm12OnRoaXMuSmooYSl9LEpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2o6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMuc3EoYSl9LHNxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6CnRoaXMuU3coYSl9LFN3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udzp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZnQ6dGhpcy5TdihhKX0sU3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Udjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuUG18fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLmx2KDQpfSkuY2FsbChhdUZlZXNodWVlWWFpeW9vLGF1RmVlc2h1ZWVZYWl5b28pOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
5.9.139.135
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.135.139.9.5.clients.your-server.de
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
|
GET
H2
|
200
|
iframe
sync.teads.tv/
Frame DD90
|
0
0
|
50ms
46ms
|
Document
text/html |
2.18.232.7
Akamai Technologies
|
|
General
- Full URL
- https://sync.teads.tv/iframe?pid=73584&userId=f4b0ea10-d272-4741-b455-c4cbc0624bea&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1572233521691
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
akka-http/10.1.5 /
- Resource Hash
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
95ms
91ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20fu%3Dtm%20trl%3D38%20tre%3D16%20frl%3D22%20fre%3D62%20a%3D3%20b%3D2%20d%3D0%20c%3D6%20e%3D6%20f%3D109%20g%3D0%20h%3D88%20i%3D2%20
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
96ms
93ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20fu%3Dtpb%20q%3D223%20
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
72ms
66ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
98ms
93ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20f41
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
100ms
96ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20fu%3Dac%20l%3D300%20
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
70ms
67ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
100ms
98ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D73584%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20f51
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
98ms
89ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20fu%3Dtm%20trl%3D38%20tre%3D16%20frl%3D22%20fre%3D62%20a%3D20%20b%3D2%20d%3D0%20c%3D3%20e%3D5%20f%3D97%20g%3D0%20h%3D187%20i%3D1%20
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==
s8t.teads.tv/sumo/receiver/v1/http/
|
0
0
|
98ms
90ms
|
Image
text/plain |
2a02:26f0:6c00:295::36f1
AKAMAI-ASN1
|
|
General
- Full URL
- https://s8t.teads.tv/sumo/receiver/v1/http/ZaVnC4dhaV3tMuL-jxvu514sKTR1JLPJH0zZLzvxn3qMwWPdO_mBRbSGTyZgi2P4CqAJ4tfCX6IriPgecDkMFRxDm1GAGUben7xo9S92iY-h9z-o4eCwqg==?%5B141%7Cdesktop%7CMac%20OS%7C10.14.5%7CChrome%7C74%7Cweb%7C%5D%5Bp%3D76332%3Bs%3D%3Bg%3D%5D%5Binfo%5D%20fu%3Dtpb%20q%3D298%20
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:295::36f1
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
84ms
83ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=aa3f9f13-d188-f774-462c-bfeac6392bb9&tv={c:sjgaaq,pingTime:-10,time:663,type:s,mvn:ZnNjPTEyLHNkPTMsbm89Nyxhc3A9MQ--,fsc:17.4.95v220002022020220000022002222000022220202020222220222220002222022002222200002220222022222222222000220200000022220222220222222222222202222222222222222222222222222222222222200000022022020020000002002202022022022222222000000000020222202022022222000000020000000000000000000002220002220000022200222202220022200200222022202220022222220020222222000220000222202222202222000002002002222222222220022202200022002220222202,sd:MTcuNC45NXYxMjAwfHwxNjAwfHwxfHwxfHwyNHx8MTIwMHx8MHx8MHx8MXx8bGFuZHNjYXBlLXByaW1hcnl8fDI0fHw0LzN8fDQvM3x8MHx8MTYwMA--,no:MTcuNC45NXZNb3ppbGxhfHxOZXRzY2FwZXx8bnx8MTZ8fG58fDB8fG58fExpbnV4IHg4Nl82NHx8R2Vja298fDIwMDMwMTA3fHwtNjB8fE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE0XzUpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NC4wLjM3MjkuMTY5IFNhZmFyaS81MzcuMzZ8fDF8fDF8fEdvb2dsZSBJbmMufHxu,asp:1572233522013||531e2be7ced10c7a7245e81c2878a458||675c74d5f114ba25a49fb0f4cb02f70f||a57b2a5ec503e50c48072d5d79af477b||31b6969998595d978d92459bf6edcbfb||b17a90fae5b1f5e4da2dfad26d5e0a13||23f78bf1770c6c50ed9a4d2fa75096a8||f04803b34bc757c50ee47904b1e81cdf||1529428597}
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
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
|
5198739247
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
44 B
249 B
|
23ms
8ms
|
XHR
application/json |
35.157.25.58
Amazon.com
|
|
|
GET
H2
|
200
|
/
Show response
track.adform.net/Serving/Cookie/
|
92 B
469 B
|
22ms
21ms
|
Script
text/javascript |
37.157.2.237
ADFORM
|
|
|
GET
H2
|
200
|
f9b17833-d68c-4e4d-b319-d6061d45aa9f
Show response
boot.pubstack.io/v1/tag/
|
1 KB
826 B
|
97ms
33ms
|
Script
application/javascript |
34.246.21.201
Amazon.com
|
|
|
GET
H2
|
200
|
content14_10_18m.js
Show response
vidstat.taboola.com/
|
37 KB
8 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
oppsula.js
Show response
vidstat.taboola.com/oppsula/1.3.6/
|
15 KB
5 KB
|
6ms
5ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
OvaMediaPlayer.js
Show response
vidstat.taboola.com/vpaid/vPlayer/player/v10.5.1/
|
678 KB
180 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
sync
match.taboola.com/
Frame B161
|
0
0
|
15ms
15ms
|
Document
text/html |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sync?dast=V7KiYCFgMdfZ6mT0pLeAQdfZ6mT0pLeAUAAAAGBvQHHLFZkGicBYOxYSyWg9VsMZwsJrvBZrNY7KYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQ8G-kBYV-XbZRAWJRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDgBrF2mpClOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugMbLHYLVarM4jJZrSbzA4AAADg7v___18PxHyr0cq0Me4Wzplzs5lNPJPlcrSZGTYmh8lhcW1vqgM3SsLf56JvRFhmv--goJyeHrPLIGO5TAa1QNY0ufwG8UHDsJwMgvlN2GK0mkw2y-FsuZgMhqPhaLQ_gRsNcIKGw8FiN1jsFovhZDEZDZaDBQrEYIITMhxtJqvRbrWbLIeT0Wi2mWyQolWr2WgzGK5mk9lutxoOhsvRCClas5hNJovZaLnbDJaT0WA4GQ4RBofLkWtmc62Vg5VzLZqNdmvhwrhYi1zGkcPk2gxXzt1a9PqYTgubyzYxbFEwQGkvgot0ojld_i6X5a15W9w6p89hEUs0J4t0Irvsa77VaGXaGHcL58y52cwmnslyOdrMDBuTw-SwuPbF4XLkmtlca-Vg5VyLZqPdWrgwLtYil3HkMLk2w5Vztxa9PqbTwuayTQz7xmo3mWw2q8lg31jtJpPNZjUZ7Dt0hu_qczYqb1qFR6e7KX9D0cxpULgMFu9PYlpMu7OD5_c7OlWqi8bYkH0TCrPBYzAoYongdJFORC_j6SKWSJ4W6USymi03vpFzNLPsFrPhzGWbzIyjhXPmWDiMk8VkIpYoTRfpRK97WRyGw-cveDgPD7Nf9DQcPn_Bw3l4mN1iv89pd2v-bp3LaPq8VXeTW_N3i_0uz-mtNFreYr_PaXcLLn-L2eV2WdR_bIjRaK6bzRWD5VwzWCUAAAAAAAAAgCXMmTcBAAAAOA1ksRhMFssFgBBj3SX4lAp5dAJ_K278GGJOl7_LZXlr3ha3zulzWBlAYqcA!&excid=22&docw=0&cijs=1
- Requested by
- Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_13/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/1.13.12 /
- Resource Hash
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
52 B
|
16ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=45&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7OcACFgMdfZ6mT0pLeAQdfZ6mT0pLeAUAAAAGBvQHG7FZkGicBYOxYSyWg9VssdzMRpvVYLYaDIEjNgsSjbNgMDaMxXKwmi2Gk8VkN9hsFovdFEKM5TIZ1AIJy-z3HRSU09NjdhlkLJfJoBbImiaX3w1faDodPte9Xvf73XVOn8Mucvl1L4vDcPj8BQ_n4WH2i56Gw-cveDgPD7Nb7Pc57W7N361zGU2ft-pucmv-brHf5Tm9lUbLW-z3Oe1uweVvMbvcLr8cAAAAAB4AlAr7IX4AAQAiAAAAACQAAAAAKAIq_i0ELgAAAAAwAAqwfjQAoDgYznW3vuxGh-vzsvsDAOAhAAQAYECBBGAAp6kEoCLn4AQAAAAAAAAAgOX___8_BkCP-EwGIENpsAfgwQfggaggsYgRAAAAACRTm8fRpE6oLKoAAAjSrQCuAAAC3CDWThPCAAAACMYW6GHx-80Ou8bvdhkAAAAAAAAAgNn_2T-aENGYW1oQSwGv2i8gAMDaLyAAAJu6AQC8BcAFnYEtFrvFanUGMdmMdpPZAQAAANz9____64GYbzVamTbG3cI5c242s4lnslyONjPDxuQwOSyu7U114EZJ-Ptc9I0Iy-z3HRSU09NjdhlkLJfJoBbImiaX3yA-aBiWk0EwvwlbjFaTyWY5nC0Xk8FwNByN9idwowFO0HA4WOwGi91iMZwsJqPBcrBAgRhMcEKGo81kNdqtdpPlcDIazTaTDVK0ajUbbQbD1Wwy2-1Ww8FwORohRWsWs8lkMRstd5vBcjIaDCfDIcLgcDlyzWyutXKwcq5Fs9FuLVwYF2uRyzhymFyb4cq5W4teH9NpYXPZJoYtCgYo7UVwkU40p8vf5bK8NW-LW-f0OSxiieZkkU5kl33NtxqtTBvjbuGcOTeb2cQzWS5Hm5lhY3KYHBbXvjhcjlwzm2utHKyca9FstFsLF8bFWuQyjhwm12a4cu7WotfHdFrYXLaJYd9Y7SaTzWY1Gewbq91kstmsJoN9h87wXX3ORuVNq_DodDflbyiaOQ0Kl8Hi_UlMi2l3dvD8fkenSnXRGBuyb0JhNngMBkUsEZwu0onoZTxdxBLJ0yKdSFaz5cY3co5mlt1iNpy5bJOZcbRwzhwLh3GymEzEEqXpIp3odS-Lw3D4_AUP5-Fh9ouehsPnL3g4Dw-zW-z3Oe1uzd-tcxlNn7fqbnJr_m6x3-U5vZVGy1vs9zntbsHlbzG73C6L-o8NMRrNdbO5YrCcawarBAAAAAAAAACwhDnzJgAAAACngSwWg8liuQAQYqy7BJ9SIY9O4G_FjR9DzOnyd7ksb83b4tY5fQ4rA0jsFAA!&cmcv=&pix=31589837&cb=1572233522388&uv=231413&tms=1572233522388&abt=expl_vA!ufm_vE&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1572233519933.8542!ts:1572233522387&
- 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/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
76 B
|
16ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=72&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7OcACFgMdfZ6mT0pLeAQdfZ6mT0pLeAUAAAAGBvQHG7FZkGicBYOxYSyWg9VssdzMRpvVYLYaDIEjNgsSjbNgMDaMxXKwmi2Gk8VkN9hsFovdFEKM5TIZ1AIJy-z3HRSU09NjdhlkLJfJoBbImiaX3w1faDodPte9Xvf73XVOn8Mucvl1L4vDcPj8BQ_n4WH2i56Gw-cveDgPD7Nb7Pc57W7N361zGU2ft-pucmv-brHf5Tm9lUbLW-z3Oe1uweVvMbvcLr8cAAAAAB4AlAr7IX4AAQAiAAAAACQAAAAAKAIq_i0ELgAAAAAwAAqwfjQAoDgYznW3vuxGh-vzsvsDAOAhAAQAYECBBGAAp6kEoCLn4AQAAAAAAAAAgOX___8_BkCP-EwGIENpsAfgwQfggaggsYgRAAAAACRTm8fRpE6oLKoAAAjSrQCuAAAC3CDWThPCAAAACMYW6GHx-80Ou8bvdhkAAAAAAAAAgNn_2T-aENGYW1oQSwGv2i8gAMDaLyAAAJu6AQC8BcAFnYEtFrvFanUGMdmMdpPZAQAAANz9____64GYbzVamTbG3cI5c242s4lnslyONjPDxuQwOSyu7U114EZJ-Ptc9I0Iy-z3HRSU09NjdhlkLJfJoBbImiaX3yA-aBiWk0EwvwlbjFaTyWY5nC0Xk8FwNByN9idwowFO0HA4WOwGi91iMZwsJqPBcrBAgRhMcEKGo81kNdqtdpPlcDIazTaTDVK0ajUbbQbD1Wwy2-1Ww8FwORohRWsWs8lkMRstd5vBcjIaDCfDIcLgcDlyzWyutXKwcq5Fs9FuLVwYF2uRyzhymFyb4cq5W4teH9NpYXPZJoYtCgYo7UVwkU40p8vf5bK8NW-LW-f0OSxiieZkkU5kl33NtxqtTBvjbuGcOTeb2cQzWS5Hm5lhY3KYHBbXvjhcjlwzm2utHKyca9FstFsLF8bFWuQyjhwm12a4cu7WotfHdFrYXLaJYd9Y7SaTzWY1Gewbq91kstmsJoN9h87wXX3ORuVNq_DodDflbyiaOQ0Kl8Hi_UlMi2l3dvD8fkenSnXRGBuyb0JhNngMBkUsEZwu0onoZTxdxBLJ0yKdSFaz5cY3co5mlt1iNpy5bJOZcbRwzhwLh3GymEzEEqXpIp3odS-Lw3D4_AUP5-Fh9ouehsPnL3g4Dw-zW-z3Oe1uzd-tcxlNn7fqbnJr_m6x3-U5vZVGy1vs9zntbsHlbzG73C6L-o8NMRrNdbO5YrCcawarBAAAAAAAAACwhDnzJgAAAACngSwWg8liuQAQYqy7BJ9SIY9O4G_FjR9DzOnyd7ksb83b4tY5fQ4rA0jsFAA!&cmcv=&pix=&cb=1572233522414&uv=231413&tms=1572233522414&abt=expl_vA!ufm_vE&ft=0&unm=FEED_MANAGER
- 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/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
/
cx.atdmt.com/
Redirect Chain
-
https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
-
https://cx.atdmt.com/?c=12907817025596586256&f=AYw07qH0FHr9O1CKhQUr-LzIraZbkcwtJeMEwGSdkDPvqBCguvmhBLniI7JHNQK_hWmIiMyNdeBUqLc9r9OTSH3s&id=1773162896260346&l=3&v=0
|
42 B
212 B
|
40ms
39ms
|
Image
image/gif |
2a03:2880:f01c:8004:face:b00c:0:8c
Facebook
|
|
|
GET
BLOB
|
206
Partial Content
|
be90f3fb-b31a-433c-97ea-096efd0b7bdb
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
BLOB
|
206
Partial Content
|
5f3a52ee-35d4-4b60-a437-fec80372ce4d
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
6ms
5ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/285/5184/s/
|
39 KB
14 KB
|
40ms
9ms
|
Script
application/javascript |
89.163.159.106
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
1 KB
1014 B
|
92ms
21ms
|
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
29ms
|
Script
text/javascript |
54.246.164.155
Amazon.com
|
|
|
GET
H2
|
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
496 B
|
29ms
15ms
|
Image
image/gif |
35.186.238.175
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
84ms
83ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=aa3f9f13-d188-f774-462c-bfeac6392bb9&tv={c:sjgahe,pingTime:1,time:1085,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:19}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1085,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:19,wc:0.0.1600.1200,ac:968.499.300.250,am:i,cc:968.499.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1080~100],as:[1080~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:87,fm:rGa7D15+11|12|1311|1312|1313|14|151|1611|17|18|19|1a|1b|1c|1d|1e|1f|1g|1h|1i|1j*.346702-39754020|1k,idMap:1j*,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
|
168ms
84ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=aa3f9f13-d188-f774-462c-bfeac6392bb9&tv={c:sjgahf,pingTime:1,time:1086,type:c,clog:[{piv:100,vs:i,r:,w:300,h:250,t:19}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1086,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:19,wc:0.0.1600.1200,ac:968.499.300.250,am:i,cc:968.499.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1081~100],as:[1081~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:87,fm:rGa7D15+11|12|1311|1312|1313|14|151|1611|17|18|19|1a|1b|1c|1d|1e|1f|1g|1h|1i|1j*.346702-39754020|1k,idMap:1j*,rend:0,renddet:WINDOW,rmeas:0,metricId:forwrd1}&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
H2
|
200
|
player.css
vidstat.taboola.com/vpaid/vPlayer/player/v10.5.1/assets/
|
14 KB
3 KB
|
6ms
6ms
|
Stylesheet
text/css |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
53 B
|
15ms
15ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=81&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7OcACFgMdfZ6mT0pLeAQdfZ6mT0pLeAUAAAAGBvQHG7FZkGicBYOxYSyWg9VssdzMRpvVYLYaDIEjNgsSjbNgMDaMxXKwmi2Gk8VkN9hsFovdFEKM5TIZ1AIJy-z3HRSU09NjdhlkLJfJoBbImiaX3w1faDodPte9Xvf73XVOn8Mucvl1L4vDcPj8BQ_n4WH2i56Gw-cveDgPD7Nb7Pc57W7N361zGU2ft-pucmv-brHf5Tm9lUbLW-z3Oe1uweVvMbvcLr8cAAAAAB4AlAr7IX4AAQAiAAAAACQAAAAAKAIq_i0ELgAAAAAwAAqwfjQAoDgYznW3vuxGh-vzsvsDAOAhAAQAYECBBGAAp6kEoCLn4AQAAAAAAAAAgOX___8_BkCP-EwGIENpsAfgwQfggaggsYgRAAAAACRTm8fRpE6oLKoAAAjSrQCuAAAC3CDWThPCAAAACMYW6GHx-80Ou8bvdhkAAAAAAAAAgNn_2T-aENGYW1oQSwGv2i8gAMDaLyAAAJu6AQC8BcAFnYEtFrvFanUGMdmMdpPZAQAAANz9____64GYbzVamTbG3cI5c242s4lnslyONjPDxuQwOSyu7U114EZJ-Ptc9I0Iy-z3HRSU09NjdhlkLJfJoBbImiaX3yA-aBiWk0EwvwlbjFaTyWY5nC0Xk8FwNByN9idwowFO0HA4WOwGi91iMZwsJqPBcrBAgRhMcEKGo81kNdqtdpPlcDIazTaTDVK0ajUbbQbD1Wwy2-1Ww8FwORohRWsWs8lkMRstd5vBcjIaDCfDIcLgcDlyzWyutXKwcq5Fs9FuLVwYF2uRyzhymFyb4cq5W4teH9NpYXPZJoYtCgYo7UVwkU40p8vf5bK8NW-LW-f0OSxiieZkkU5kl33NtxqtTBvjbuGcOTeb2cQzWS5Hm5lhY3KYHBbXvjhcjlwzm2utHKyca9FstFsLF8bFWuQyjhwm12a4cu7WotfHdFrYXLaJYd9Y7SaTzWY1Gewbq91kstmsJoN9h87wXX3ORuVNq_DodDflbyiaOQ0Kl8Hi_UlMi2l3dvD8fkenSnXRGBuyb0JhNngMBkUsEZwu0onoZTxdxBLJ0yKdSFaz5cY3co5mlt1iNpy5bJOZcbRwzhwLh3GymEzEEqXpIp3odS-Lw3D4_AUP5-Fh9ouehsPnL3g4Dw-zW-z3Oe1uzd-tcxlNn7fqbnJr_m6x3-U5vZVGy1vs9zntbsHlbzG73C6L-o8NMRrNdbO5YrCcawarBAAAAAAAAACwhDnzJgAAAACngSwWg8liuQAQYqy7BJ9SIY9O4G_FjR9DzOnyd7ksb83b4tY5fQ4rA0jsFAA!&cmcv=&uv=231413&unm=FEED_MANAGER&cb=1572233522482&abt=expl_vA!ufm_vE&baseReportD=taboola.com&dataCenter=am&
- 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/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
|
match
pixel.consentric.de/tp/
|
43 B
354 B
|
42ms
12ms
|
Image
image/gif |
62.138.221.190
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
monitoring.js
Show response
cdn.prod.pubstack.io/
|
61 KB
19 KB
|
20ms
6ms
|
XHR
application/javascript |
34.95.76.218
Google LLC
|
|
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame E17A
|
42 B
110 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:820::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsuHey-hhuzRrzVUDSzDnJigQsfA0TCK-86JgpwksQM-dJ54QH2By1Bu44V9LbFrCMgSD3W-MpM0QF3kOETfjTFlH_bILrYqV4VoJXb_Beo&sig=Cg0ArKJSzERWgYhr7e-REAE&adk=3694558186&tt=135&bs=1585%2C1200&mtos=1043,1043,1043,1043,1043&tos=1043,0,0,0,0&p=138,968,388,1268&mcvt=1043&rs=3&ht=0&tfs=962&tls=2005&mc=1<e=1&bas=0&bac=0&met=no&avms=nio&niot_obs=697&niot_cbk=706&md=2&lm=2&rst=1572233521265&rpt=242&isd=0&msd=0&oseid=3&xdi=0&mxd=1&ps=1585%2C7733&ss=1600%2C1200&pt=1871&bin=1&deb=1-2-7-33-17-27-115-15-0-0-0&tvt=1984&r=v&id=osdim&vs=4&uc=8&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191025
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::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
|
segments
Show response
api.theadex.com/v0.9/pub/
|
56 B
126 B
|
34ms
10ms
|
Script
text/plain |
89.163.159.119
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.119
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
|
22ms
6ms
|
Script
application/javascript |
2600:9000:21f3:b000:1c:8c89:a300:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
31ms
31ms
|
Script
text/javascript |
54.246.164.155
Amazon.com
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=021fdbf30dd8d372e04d562ade424c22&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=613966128577
- 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.246.164.155
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-54-246-164-155.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- 53a38f86fa5053bcbf87501d40ada9fa4aaf0c1dbbe1c737387fdf762b91352d
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
848 B
|
136ms
29ms
|
Script
application/javascript |
34.249.185.179
Amazon.com
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
Frame F008
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBD7sBsakBDwkWiUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://uss.xplosion.de/usersync?sid=65966&fpid=4207921860034692163
|
42 B
660 B
|
30ms
29ms
|
Image
image/gif |
54.246.164.155
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame C799
|
0
0
|
133ms
30ms
|
Document
text/html |
34.248.95.73
Amazon.com
|
|
|
POST
H2
|
204
|
error
Show response
intake.prod.pubstack.io/v1/intake/
|
0
57 B
|
29ms
29ms
|
XHR
text/plain |
52.30.195.15
Amazon.com
|
|
|
POST
H2
|
204
|
auction
Show response
intake.prod.pubstack.io/v1/intake/
|
0
57 B
|
29ms
29ms
|
XHR
text/plain |
52.30.195.15
Amazon.com
|
|
|
GET
H2
|
200
|
5197912465
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
44 B
248 B
|
8ms
7ms
|
XHR
application/json |
35.157.25.58
Amazon.com
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
|
42 B
660 B
|
29ms
29ms
|
Image
image/gif |
54.246.164.155
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame E130
|
0
0
|
20ms
5ms
|
Document
text/html |
2.18.232.130
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
-
2.18.232.130
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-130.deploy.static.akamaitechnologies.com
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H2
|
200
|
pd
eu-u.openx.net/w/1.0/
Frame 31AE
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.165.0 /
- Resource Hash
|
GET
H2
|
200
|
sync
match.taboola.com/
Frame 7B0A
|
0
0
|
15ms
15ms
|
Document
text/html |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sync?dast=V7KiYCFgMdfZ6mT0pLeAQdfZ6mT0pLeAUAAAAGBvQHHLFZkGicBYOxYSyWg9VsMZwsJrvBZrNY7KYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQ8G-kBYV-XbZRAWJRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDgBrF2mpClOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugMbLHYLVarM4jJZrSbzA4AAADg7v___18PxHyr0cq0Me4Wzplzs5lNPJPlcrSZGTYmh8lhcW1vqgM3SsLf56JvRFhmv--goJyeHrPLIGO5TAa1QNY0ufwG8UHDsJwMgvlN2GK0mkw2y-FsuZgMhqPhaLQ_gRsNcIKGw8FiN1jsFovhZDEZDZaDBQrEYIITMhxtJqvRbrWbLIeT0Wi2mWyQolWr2WgzGK5mk9lutxoOhsvRCClas5hNJovZaLnbDJaT0WA4GQ4RBofLkWtmc62Vg5VzLZqNdmvhwrhYi1zGkcPk2gxXzt1a9PqYTgubyzYxbFEwQGkvgot0ojld_i6X5a15W9w6p89hEUs0J4t0Irvsa77VaGXaGHcL58y52cwmnslyOdrMDBuTw-SwuPbF4XLkmtlca-Vg5VyLZqPdWrgwLtYil3HkMLk2w5Vztxa9PqbTwuayTQz7xmo3mWw2q8lg31jtJpPNZjUZ7Dt0hu_qczYqb1qFR6e7KX9D0cxpULgMFu9PYlpMu7OD5_c7OlWqi8bYkH0TCrPBYzAoYongdJFORC_j6SKWSJ4W6USymi03vpFzNLPsFrPhzGWbzIyjhXPmWDiMk8VkIpYoTRfpRK97WRyGw-cveDgPD7Nf9DQcPn_Bw3l4mN1iv89pd2v-bp3LaPq8VXeTW_N3i_0uz-mtNFreYr_PaXcLLn-L2eV2WdR_bIjRaK6bzRWD5VwzWCUAAAAAAAAAgCXMmTcBAAAAOA1ksRhMFssFgBBj3SX4lAp5dAJ_K278GGJOl7_LZXlr3ha3zulzWBlAYqcA!&excid=22&docw=0&cijs=1
- Requested by
- Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_13/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/1.13.12 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
data
lb51.s400.meetrics.net/
|
43 B
308 B
|
1ms
1ms
|
Image
image/gif |
136.243.4.81
HETZNER-AS
|
|
General
- Full URL
- https://lb51.s400.meetrics.net/data?/UN35GJOBALl1FDLkqFKtkyB23A52AwwA6wEylF0pFtlF2qoFx1A3yAyzAz1Ax5A5zAz0El3FmjFnpFqqFjBFUkzFBDZAAAOA55A55A85B55A58E55A55AGAx2Az1A40ArbosAPgBAJPAKCAHbosAPULAJPAeEAKbosAPoBAAZAwSAcAAAAPFDAJPANNAKbosAPmBAxYAqMAMhRjAPAAAJPA0OAKbosAPGDAJPAqQAKbosAPnBAJPAGRAKbosAPGDAJPAWRAKbosAPsEAxYAMPAMhRjARksFAQtjFnO6ZSA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.81
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h229.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
sync
match.taboola.com/
Frame 32E6
|
0
0
|
15ms
15ms
|
Document
text/html |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sync?dast=V7KiYCFgMdfZ6mT0pLeAQdfZ6mT0pLeAUAAAAGBvQHHLFZkGicBYOxYSyWg9VsMZwsJrvBZrNY7KYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQ8G-kBYV-XbZRAWJRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDgBrF2mpClOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugMbLHYLVarM4jJZrSbzA4AAADg7v___18PxHyr0cq0Me4Wzplzs5lNPJPlcrSZGTYmh8lhcW1vqgM3SsLf56JvRFhmv--goJyeHrPLIGO5TAa1QNY0ufwG8UHDsJwMgvlN2GK0mkw2y-FsuZgMhqPhaLQ_gRsNcIKGw8FiN1jsFovhZDEZDZaDBQrEYIITMhxtJqvRbrWbLIeT0Wi2mWyQolWr2WgzGK5mk9lutxoOhsvRCClas5hNJovZaLnbDJaT0WA4GQ4RBofLkWtmc62Vg5VzLZqNdmvhwrhYi1zGkcPk2gxXzt1a9PqYTgubyzYxbFEwQGkvgot0ojld_i6X5a15W9w6p89hEUs0J4t0Irvsa77VaGXaGHcL58y52cwmnslyOdrMDBuTw-SwuPbF4XLkmtlca-Vg5VyLZqPdWrgwLtYil3HkMLk2w5Vztxa9PqbTwuayTQz7xmo3mWw2q8lg31jtJpPNZjUZ7Dt0hu_qczYqb1qFR6e7KX9D0cxpULgMFu9PYlpMu7OD5_c7OlWqi8bYkH0TCrPBYzAoYongdJFORC_j6SKWSJ4W6USymi03vpFzNLPsFrPhzGWbzIyjhXPmWDiMk8VkIpYoTRfpRK97WRyGw-cveDgPD7Nf9DQcPn_Bw3l4mN1iv89pd2v-bp3LaPq8VXeTW_N3i_0uz-mtNFreYr_PaXcLLn-L2eV2WdR_bIjRaK6bzRWD5VwzWCUAAAAAAAAAgCXMmTcBAAAAOA1ksRhMFssFgBBj3SX4lAp5dAJ_K278GGJOl7_LZXlr3ha3zulzWBlAYqcA!&excid=22&docw=0&cijs=1
- Requested by
- Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_13/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/1.13.12 /
- Resource Hash
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
7ms
7ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
|