GET
H2
|
200
|
Primary Request
/
Show response
www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
|
133 KB
51 KB
|
169ms
127ms
|
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
|
20ms
20ms
|
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_128_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
|
24ms
23ms
|
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_128_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
|
26ms
25ms
|
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_128_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
|
GET
H2
|
200
|
metaTag.min.45d873e21c33035ceb097390818621c6.js
Show response
js.stroeermediabrands.de/
|
279 KB
62 KB
|
86ms
30ms
|
Script
application/javascript |
46.253.113.178
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
lux.js
Show response
cdn.speedcurve.com/js/
|
19 KB
7 KB
|
76ms
20ms
|
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, US),
- Reverse DNS
- Software
-
Apache /
- Resource Hash
- 8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
pre-298466378d.js
Show response
www.giga.de/static-local/dist/assets/js/
|
33 KB
11 KB
|
28ms
27ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
main-desktop-d4e3d0182b.css
www.giga.de/static-local/dist/assets/css/
|
547 KB
62 KB
|
29ms
29ms
|
Stylesheet
text/css |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
|
38 KB
11 KB
|
70ms
24ms
|
Script
application/javascript |
91.215.100.39
INFONLINE-AS
|
|
|
GET
H/1.1
|
200
OK
|
trackcp.js
Show response
gocp.stroeermediabrands.de/
|
28 KB
11 KB
|
111ms
24ms
|
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
|
80ms
26ms
|
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/
|
107 KB
39 KB
|
33ms
20ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
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:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 7b59a246f1365e5c4214a803a2f4a224ab633eaf9270e2705382a80379345df0
- 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
180 B
|
7ms
6ms
|
Image
image/gif |
2a00:1450:4001:81b::2003
GOOGLE
|
|
|
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
332 B
|
20ms
19ms
|
Image
image/gif |
161.156.66.178
SOFTLAYER
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
261 B
|
7ms
6ms
|
Image
image/gif |
2a03:2880:f12d:83:face:b00c:0:25de
FACEBOOK
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
44 KB
18 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/analytics.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-298466378d.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- e7edf06d6436ec9420c26e56bd02ef5f5c93a9fb189ed16b1db402e57a0ea796
- 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/
|
87 KB
25 KB
|
101ms
60ms
|
Script
application/javascript |
143.204.201.153
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
api
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://cdn.m6r.eu/sync/api
-
https://tracking.m6r.eu/sync/api?checkcookies=true
|
1 KB
1 KB
|
56ms
33ms
|
Script
application/javascript |
104.111.215.171
AKAMAI-AS
|
|
|
GET
H2
|
200
|
identitystatus
Show response
irqs.ioam.de/
|
25 B
203 B
|
88ms
28ms
|
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.9436169202737048
- Requested by
- Host: script.ioam.de
URL: https://script.ioam.de/iam.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
193.46.63.75
Alfter, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- irqs.ioam.de
- Software
-
nginx /
- Resource Hash
- 9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H/1.1
|
200
OK
|
tx.io
Show response
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2FZuid-Holland&cb=0014&i2=00144d2a2400cb9315e3cf450&ep=1609017331&...
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2FZuid-Holland&cb=0014&i2=00144d2a2400cb9315e3cf450&ep=1609017331&...
|
0
717 B
|
22ms
21ms
|
Script
application/x-javascript |
91.215.103.65
INFONLINE-AS
|
|
General
- Full URL
- https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2FZuid-Holland&cb=0014&i2=00144d2a2400cb9315e3cf450&ep=1609017331&vr=416&id=jflnsx&i3=00144d2a2400cb9315e3cf450%3A1612157008660%3A1581053008660%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1581053008660&n1=3&dntt=0<=1581053008662&ev=&cs=bgfl2r&mo=1&sr=71
- 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
-
91.215.103.65
, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- de3.ioam.de
- Software
-
nginx /
BLACKBIRD-RCV v1.06.2 0026
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
lazyload-65c07b80e0.min.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/lazyload/
|
5 KB
2 KB
|
21ms
21ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
|
10 KB
10 KB
|
20ms
20ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
176875
Show response
videos.giga.de/embed/
Frame 7103
|
9 KB
3 KB
|
85ms
36ms
|
Document
text/html |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
giga-bb5486a341.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
37 KB
13 KB
|
21ms
20ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
init
Show response
d.nativendo.de/cds/delivery/
|
1 KB
1 KB
|
65ms
25ms
|
Script
text/javascript |
107.178.241.34
GOOGLE
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/r/
|
35 B
101 B
|
13ms
13ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/r/collect?v=1&_v=j80&aip=1&a=378716984&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=4GBAAEAB~&jid=915295367&gjid=1705483915&cid=1792896362.1581053009&tid=UA-204785-4&_gid=1740020295.1581053009&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=&z=6704126
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.0
|
200
OK
|
z.js
Show response
go.giga-abs.de/
|
1 KB
1 KB
|
134ms
29ms
|
Script
text/javascript |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/z.js?0.4353675586895105
- 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
- cb9f61163028a201442cd50e47769bdf72392d85b47ac289f09255731c3a3481
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
Cookie set
iframe
tracking.m6r.eu/pixel/
Frame 1D2B
Redirect Chain
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
|
0
0
|
48ms
31ms
|
Document
text/html |
104.111.215.171
AKAMAI-AS
|
|
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.3,
, AES_256_GCM
- Server
-
104.111.215.171
, Netherlands,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a104-111-215-171.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
tfa.js
Show response
cdn.taboola.com/libtrc/unip/1092206/
|
61 KB
21 KB
|
62ms
20ms
|
Script
application/javascript |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
|
44 KB
15 KB
|
87ms
35ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
289 KB
89 KB
|
86ms
25ms
|
Script
application/javascript |
143.204.213.106
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
126 KB
49 KB
|
72ms
30ms
|
Script
text/javascript |
2.18.233.67
AKAMAI-AS
|
|
|
GET
H/1.1
|
302
Moved Temporarily
|
dmp
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://tracking.m6r.eu/sync/dmp
-
https://tracking.m6r.eu/sync/dmp?checkcookies=true
|
0
-1 B
|
68ms
29ms
|
XHR
text/plain |
104.111.215.171
AKAMAI-AS
|
|
|
GET
H2
|
200
|
nuggad
Show response
nugmw.userreport.com/rc-ap/0f15122f-dc08-44e9-9e9e-afd5a66d3f79/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/0f15122f-dc08-44e9-9e9e-afd5a66d3f79/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2...
|
2 KB
2 KB
|
50ms
21ms
|
Script
text/javascript |
2600:9000:2057:7e00:1f:a1b:34c0:93a1
AMAZON-02
|
|
General
- Full URL
- https://nugmw.userreport.com/rc-ap/0f15122f-dc08-44e9-9e9e-afd5a66d3f79/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:2057:7e00:1f:a1b:34c0:93a1
, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- 251004f646a682da6cadc4ec42f478672bd3c8dcfc62d26e5d0db1ad61d78df2
|
GET
H2
|
200
|
SDG_CookieLayer.min.js
Show response
cdn.stroeerdigitalgroup.de/metatag/libraries/
|
15 KB
3 KB
|
77ms
53ms
|
Script
application/javascript |
2a02:26f0:6c00:194::5f76
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
122 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j80&aip=1&a=378716984&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=6GBAAEAB~&jid=&gjid=&cid=1792896362.1581053009&tid=UA-204785-4&_gid=1740020295.1581053009&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=&cd21=auto&cm17=1&cd18=4282584&z=890611017
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
ad-loading.png
www.dunkirkinception.com/detect/
|
179 B
490 B
|
128ms
22ms
|
Image
image/png |
18.194.129.32
AMAZON-02
|
|
|
GET
H2
|
200
|
tag.js
Show response
js.agkn.com/prod/v0/
|
3 KB
3 KB
|
36ms
6ms
|
Script
application/javascript |
2600:9000:214f:c800:15:efbc:e300:93a1
AMAZON-02
|
|
|
GET
H2
|
200
|
post-33dedcb970.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
7 KB
3 KB
|
20ms
20ms
|
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
|
23ms
23ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/smb-phone-plan-ef34ebe4f8.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/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
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
|
GET
H/1.1
|
200
OK
|
dkuim.js
Show response
dkuim.de/api/js/2/
|
465 KB
151 KB
|
91ms
31ms
|
Script
application/javascript |
178.19.65.130
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
249 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
249 B
|
14ms
14ms
|
Script
application/javascript |
2a00:1450:4001:816::2002
GOOGLE
|
|
|
GET
H2
|
200
|
show_ads_impl_fy2019.js
Show response
pagead2.googlesyndication.com/pagead/js/r20200205/r20190131/
|
221 KB
83 KB
|
26ms
26ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20200205/r20190131/show_ads_impl_fy2019.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 33046f3ce25fbe69f34146452f47d763efd56cf867a39bfb45e19a8ee3be6df0
- 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/r20200205/r20190131/
Frame B21C
|
0
0
|
5ms
5ms
|
Document
text/html |
2a00:1450:4001:817::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20200205/r20190131/zrt_lookup.html
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
5ms
5ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j80&aip=1&a=378716984&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=Image%20Gallery&ea=visible&el=4282584&_u=6GBAAEAB~&jid=&gjid=&cid=1792896362.1581053009&tid=UA-204785-4&_gid=1740020295.1581053009&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=&cd21=auto&cm18=1&z=1032926098
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
amazon-payments-rct415x210u.jpg
static.giga.de/wp-content/uploads/2011/04/
|
10 KB
10 KB
|
41ms
41ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2011/04/amazon-payments-rct415x210u.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
- d665ad6762076513f3ad8d02bc1246a6bcf75d4df5da456aae49976b2243adf7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
Wie-funktioniert-Sofortueberweisung-Anleitung-rct200x210u.png
static.giga.de/wp-content/uploads/2015/06/
|
7 KB
8 KB
|
41ms
40ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2015/06/Wie-funktioniert-Sofortueberweisung-Anleitung-rct200x210u.png
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- dd93ca83e5a29b494b970f63833ffec494690063a0ef5bafca4c4d9c889e5fdc
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
article-rating-7143c629e5.js
Show response
www.giga.de/static-local/dist/assets/js/components/
|
306 B
534 B
|
21ms
20ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
jquery.min.js
Show response
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
|
85 KB
30 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:806::200a
GOOGLE
|
|
General
- Full URL
- https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/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:806::200a
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
loader.js
Show response
c.nativendo.de/cdn/asset/js/
|
56 KB
18 KB
|
51ms
23ms
|
Script
application/javascript |
2606:4700:20::681a:5fb
CLOUDFLARENET
|
|
|
GET
H2
|
200
|
videojs-c972511a.min.js
Show response
videos.giga.de/dist/js/embed/bundle/
Frame 7103
|
619 KB
206 KB
|
33ms
32ms
|
Script
application/javascript |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
Frame 7103
|
268 KB
91 KB
|
26ms
14ms
|
Script
text/javascript |
2a00:1450:4001:800::200a
GOOGLE
|
|
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
107 B
491 B
|
123ms
123ms
|
XHR
text/javascript |
143.204.201.153
AMAZON-02
|
|
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=htAXBgfvg8xYD&cb=0&ws=1600x1200&v=7.46.00&t=1000&slots=%5B%7B%22sd%22%3A%220%22%2C%22s%22%3A%5B%22728x90%22%2C%22800x250%22%2C%22970x250%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%221%22%2C%22s%22%3A%5B%22160x600%22%2C%22300x600%22%5D%2C%22sn%22%3A%22sky%22%7D%2C%7B%22sd%22%3A%222%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%7D%5D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.201.153
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-143-204-201-153.fra53.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- 9694d72e65a5b488a1e18d166970ab73de4848e18766fee7634d803cef4cc8f7
|
GET
H2
|
200
|
aps_csm.js
Show response
c.amazon-adsystem.com/bao-csm/aps-comm/
|
6 KB
3 KB
|
57ms
20ms
|
XHR
application/javascript |
143.204.201.153
AMAZON-02
|
|
|
GET
H2
|
200
|
videojs-f50f7a8d.css
videos.giga.de/dist/css/
Frame 7103
|
53 KB
15 KB
|
56ms
56ms
|
Stylesheet
text/css |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
play_button.svg
videos.giga.de/image/
Frame 7103
|
1015 B
1 KB
|
55ms
54ms
|
Image
image/svg+xml |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
loader.js
Show response
cdn.taboola.com/libtrc/stroeer-smb-giga/
|
119 KB
23 KB
|
23ms
20ms
|
Script
application/javascript |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
10ms
6ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j80&aip=1&a=378716984&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=deutsche%20Paypal-Webseite&_u=6GBAAEAB~&jid=&gjid=&cid=1792896362.1581053009&tid=UA-204785-4&_gid=1740020295.1581053009&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cd45=all&cm75=1&z=1869361649
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
9ms
6ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j80&aip=1&a=378716984&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=Paypal-Login-Seite&_u=6GBAAEAB~&jid=&gjid=&cid=1792896362.1581053009&tid=UA-204785-4&_gid=1740020295.1581053009&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cd45=all&cm75=1&z=1336332632
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
12ms
11ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j80&aip=1&a=378716984&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=Login-Seite&_u=6GBAAEAB~&jid=&gjid=&cid=1792896362.1581053009&tid=UA-204785-4&_gid=1740020295.1581053009&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cd45=all&cm75=1&z=241689306
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
11ms
10ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j80&aip=1&a=378716984&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=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEAB~&jid=&gjid=&cid=1792896362.1581053009&tid=UA-204785-4&_gid=1740020295.1581053009&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=&cd39=Image&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cd45=all&cm75=1&z=1075799156
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
8ms
5ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j80&aip=1&a=378716984&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(Android)%20downloaden*&_u=6GBAAEAB~&jid=&gjid=&cid=1792896362.1581053009&tid=UA-204785-4&_gid=1740020295.1581053009&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cd45=all&cm75=1&z=853185341
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
8ms
5ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j80&aip=1&a=378716984&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(iOS)%20downloaden*&_u=6GBAAEAB~&jid=&gjid=&cid=1792896362.1581053009&tid=UA-204785-4&_gid=1740020295.1581053009&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cd45=all&cm75=1&z=940887884
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j80&aip=1&a=378716984&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=embed&el=Paypal%20(Windows%20Phone)%20downloaden*&_u=6GBAAEAB~&jid=&gjid=&cid=1792896362.1581053009&tid=UA-204785-4&_gid=1740020295.1581053009&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cd45=all&cm75=1&z=926421941
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
dmp
Show response
tracking.m6r.eu/sync/
|
97 B
619 B
|
77ms
76ms
|
XHR
application/json |
104.111.215.171
AKAMAI-AS
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 1A77
|
0
0
|
273ms
272ms
|
Document
text/html |
2a00:1450:4001:817::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1459277723&w=468&lmt=1581053008&psa=0&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&adsid=NT&dt=1581053008800&bpp=14&bdt=241&fdt=77&idt=77&shv=r20200205&cbv=r20190131&ptt=9&saldr=aa&abxe=1&correlator=4497802969702&frm=20&pv=2&ga_vid=1792896362.1581053009&ga_sid=1581053009&ga_hid=378716984&ga_fc=0&iag=0&icsg=3302695695026&dssz=66&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=450&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065305&oid=3&pvsid=1682944123006514&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=VpG1apNnOK&p=https%3A//www.giga.de&dtd=94
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200205/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
|
74 KB
27 KB
|
15ms
14ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200205/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 18f31e7cf5554306ac5bf2bd314fb4aeb32cbf5379c8f6a0e156e5990b1b00ff
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
3 KB
2 KB
|
943ms
942ms
|
Script
text/javascript |
104.111.215.171
AKAMAI-AS
|
|
|
GET
H2
|
200
|
smb-article-rating-f9506c2d61.min.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/
|
18 KB
6 KB
|
21ms
20ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/smb-article-rating-f9506c2d61.min.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/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
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 3A3C
|
0
0
|
16ms
15ms
|
Document
text/html |
2a00:1450:4001:817::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1581053008&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C17%3A32%2C24%3A32%2C25%3A32%2C30%3A1081344%2C32%3A32%2C40%3A32&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.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=1581053008814&bpp=4&bdt=255&fdt=121&idt=122&shv=r20200205&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=4497802969702&frm=20&pv=1&ga_vid=1792896362.1581053009&ga_sid=1581053009&ga_hid=378716984&ga_fc=0&iag=0&icsg=52843131120440&dssz=69&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=21065305&oid=3&pvsid=1682944123006514&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=126
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200205/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
bootstrap.min.js
Show response
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
|
36 KB
10 KB
|
28ms
11ms
|
Script
text/javascript |
2001:4de0:ac19::1:b:3a
HIGHWINDS3
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
26ms
25ms
|
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=1581053008953&__it=-60&__ic=727391&__iq=63ff84678e09dd57dea3e760b4facd34&__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
|
pubads_impl_2020013001.js
Show response
securepubads.g.doubleclick.net/gpt/
|
167 KB
61 KB
|
34ms
33ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
POST
H2
|
204
|
session
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
79ms
20ms
|
XHR
text/plain |
3.123.216.32
AMAZON-02
|
|
|
GET
H2
|
200
|
ForumViewTopicContentAD.Cj3s-YOGFGen4.png
www.giga.de/special/gutscheine/
|
71 B
273 B
|
32ms
31ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/special/gutscheine/ForumViewTopicContentAD.Cj3s-YOGFGen4.png
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
TSAdServer
- Resource Hash
- 790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
|
GET
H2
|
200
|
impl.20200203-21-RELEASE.js
Show response
cdn.taboola.com/libtrc/
|
439 KB
124 KB
|
20ms
20ms
|
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
|
63ms
21ms
|
Script
application/x-javascript |
2.19.43.224
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
tr5
cdn.taboola.com/libtrc/
|
3 B
78 B
|
42ms
42ms
|
Image
text/html |
151.101.14.2
FASTLY
|
|
|
GET
H/1.1
|
200
OK
|
submit
lb15.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
103ms
24ms
|
Image
image/gif |
136.243.33.84
HETZNER-AS
|
|
General
- Full URL
- https://lb15.s400.meetrics.net/bb-mx/submit?/rbRDBhAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSG6APAAAAAAAAAOAAAAGRAAAAAAZwSG6ABRksFAQtjF0Y1BTA
- 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.33.84
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h381.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb15.s400.meetrics.net/
|
43 B
308 B
|
102ms
23ms
|
Image
image/gif |
136.243.33.84
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
nuggad
ih.adscale.de/
|
49 B
487 B
|
22ms
22ms
|
Image
image/gif |
2.18.234.72
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
2 KB
2 KB
|
31ms
31ms
|
Script
text/javascript |
104.111.215.171
AKAMAI-AS
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=0&n121=2&n116=0&n104=1&n15=1&n155=1&n106=1&n153=0&n11=1&n120=3&n154=1&n125=1&n8=3&n2=3&n137=0&n101=0&n108=0&n54=0&n110=0&n87=0&n149=0&n76=1&n66=1&n139=0&n160=0&n107=0&n117=2&n86=0&n147=4&n64=0&n49=2&n119=3&n22=1&n18=1&n161=0&n126=0&n92=3&n62=1&n57=1&n77=0&n83=0&n102=0&n105=0&n159=0&n20=1&n80=1&n12=1&n141=0&n157=0&n99=1&n128=1&n73=2&n118=6&n85=0&n9=2&n6=1&n63=0&n138=0&n140=0&n94=2&n111=0&n136=0&n79=0&n93=3&n90=1&n55=1&n142=0&n7=1&n103=0&n158=1&n124=0&n75=0&n91=1&n46=1&n114=0&n69=0&n47=1&n10=2&n3=1&n82=0&n84=1&n5=3&n48=1&n109=0&n122=2&n67=1&n115=1&n89=1&n123=2&n78=0&n44=1&n81=1&n88=0&n39=1&n156=1&n148=1
- Requested by
- Host: tracking.m6r.eu
URL: https://tracking.m6r.eu/sync/api?checkcookies=true
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
104.111.215.171
, Netherlands,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a104-111-215-171.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- 20ba26fd65c6048c23ebe3770ab0bc916ddb726811dbb3913064e07b297493cb
|
GET
H2
|
200
|
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/
Frame 7103
|
30 KB
30 KB
|
75ms
30ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://files.giga-video.de/75/ed/96/145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j80&aip=1&a=378716984&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.6%5D%5BUser%20Click2Play%5D&_u=6GBAAEAB~&jid=&gjid=&cid=1792896362.1581053009&tid=UA-204785-4&_gid=1740020295.1581053009&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.6&cd44=1&cm1=1&z=2091458663
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
nativendo.css
c.nativendo.de/cdn/asset/css/
|
5 KB
2 KB
|
15ms
15ms
|
Stylesheet
text/css |
2606:4700:20::681a:5fb
CLOUDFLARENET
|
|
|
GET
BLOB
|
200
OK
|
f2814616-3757-4b36-b570-18be2db9e789
https://videos.giga.de/
Frame 7103
|
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 7103
|
53 B
703 B
|
83ms
23ms
|
XHR
application/json |
52.219.74.191
AMAZON-02
|
|
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame 7103
|
265 B
436 B
|
20ms
20ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
iu3
aax-eu.amazon-adsystem.com/s/
Frame DD6C
Redirect Chain
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&dcc=t
|
0
0
|
196ms
196ms
|
Document
text/html |
52.94.216.48
AMAZON-02
|
|
General
- Full URL
- https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&dcc=t
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.94.216.48
Dublin, Ireland,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
Server /
- Resource Hash
|
GET
H2
|
200
|
/
d.agkn.com/iframe/8613/
Frame 2AEA
|
0
0
|
35ms
8ms
|
Document
text/html |
2600:9000:2057:3600:19:fc2c:a140:93a1
AMAZON-02
|
|
General
- Full URL
- https://d.agkn.com/iframe/8613/?che=268182886&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
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2600:9000:2057:3600:19:fc2c:a140:93a1
, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
|
POST
H2
|
204
|
bid
Show response
orbidder.otto.de/
|
0
144 B
|
110ms
57ms
|
XHR
text/plain |
35.206.134.202
GOOGLE-2
|
|
|
POST
H2
|
204
|
bid
Show response
orbidder.otto.de/
|
0
144 B
|
96ms
43ms
|
XHR
text/plain |
35.206.134.202
GOOGLE-2
|
|
|
POST
H2
|
204
|
bid
Show response
orbidder.otto.de/
|
0
145 B
|
95ms
42ms
|
XHR
text/plain |
35.206.134.202
GOOGLE-2
|
|
|
OPTIONS
H2
|
204
|
v1
Show response
dmx.districtm.io/b/
|
0
460 B
|
68ms
37ms
|
XHR
text/plain |
104.16.190.66
CLOUDFLARENET
|
|
|
GET
H2
|
200
|
ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1581053009237;
Show response
adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/
|
47 B
80 B
|
92ms
51ms
|
XHR
application/json |
152.199.21.32
EDGECAST
|
|
General
- Full URL
- 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=1581053009237;
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
152.199.21.32
, United States,
ASN15133
(EDGECAST, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 8e233ff9008f00ab7f796afab9f40d851adf46c2930c499eae9da454f2e2b7a4
|
GET
H2
|
200
|
ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1581053009237;
Show response
adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/
|
48 B
257 B
|
89ms
48ms
|
XHR
application/json |
152.199.21.32
EDGECAST
|
|
General
- Full URL
- 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=1581053009237;
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
152.199.21.32
, United States,
ASN15133
(EDGECAST, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 6ee3422b95c4b14a001d97559d9313a23ab13783bee9b773469197d5517b994b
|
GET
H2
|
200
|
ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1581053009237;
Show response
adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/
|
47 B
80 B
|
92ms
52ms
|
XHR
application/json |
152.199.21.32
EDGECAST
|
|
General
- Full URL
- 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=1581053009237;
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
152.199.21.32
, United States,
ASN15133
(EDGECAST, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- f768f9c6c27dfaa240acea38bff4c9da0b0894f00048a1a8e7b57a19b74dc0f0
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
21 B
708 B
|
173ms
13ms
|
XHR
application/json |
185.33.223.202
ASN-APPNEX
|
|
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
240 B
2 KB
|
406ms
93ms
|
XHR
application/json |
69.173.144.142
RUBICONPROJECT
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=750960&size_id=15&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=e319c2b4-9e45-4890-b2bd-790f28672dcd&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.17597001233627552
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.142
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT, US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- c9d684b7e98bce5aa55f848dffe0de82b7b765470201c108872efa769a726064
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
241 B
2 KB
|
505ms
99ms
|
XHR
application/json |
69.173.144.142
RUBICONPROJECT
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=1266838&size_id=9&alt_size_ids=8%2C10%2C126&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=63fcc1ac-30da-4580-a21b-c5b6b5797d38&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.9424360940534284
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.142
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT, US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- e682618ddacbc04e622ea797ae312a6cc9732a78d95b170774a271a96d822add
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
241 B
2 KB
|
593ms
87ms
|
XHR
application/json |
69.173.144.142
RUBICONPROJECT
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=1408756&size_id=2&alt_size_ids=55%2C57%2C125&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=8a2be0ed-ea9d-422f-85e1-c8d90bccfd38&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.97309006998537
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.142
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT, US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- 776523015a9fa21d9aba68cb1286ea6d66b5baefd07289a4225c79050af7c723
|
POST
|
|
translator
hbopenbid.pubmatic.com/
|
0
0
|
|
|
|
|
|
GET
H2
|
200
|
/
Show response
adx.adform.net/adx/
|
15 B
456 B
|
107ms
105ms
|
XHR
application/json |
37.157.6.245
ADFORM
|
|
General
- Full URL
- https://adx.adform.net/adx/?rp=4&bWlkPTY2NjQ0MyZ0cmFuc2FjdGlvbklkPWUzMTljMmI0LTllNDUtNDg5MC1iMmJkLTc5MGYyODY3MmRjZA%3D%3D&bWlkPTcxMzMyNiZ0cmFuc2FjdGlvbklkPTYzZmNjMWFjLTMwZGEtNDU4MC1hMjFiLWM1YjZiNTc5N2QzOA%3D%3D&bWlkPTcwNjE1MSZ0cmFuc2FjdGlvbklkPThhMmJlMGVkLWVhOWQtNDIyZi04NWUxLWM4ZDkwYmNjZmQzOA%3D%3D&pt=gross&stid=b8ae4520-b5b9-4497-8c17-dc3a332bcd74&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.6.245
, Denmark,
ASN198622
(ADFORM, DK),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 631bc9fa39ddcdd4008398e649671ba79db3cc7c1725d7b8cd9823ec243f0a48
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains |
|
GET
|
|
arj
yieldlove-d.openx.net/w/1.0/
|
0
0
|
|
|
|
|
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
21 B
709 B
|
181ms
13ms
|
XHR
application/json |
185.33.223.202
ASN-APPNEX
|
|
|
GET
|
|
cygnus
as-sec.casalemedia.com/
|
0
0
|
|
|
|
|
|
GET
H/1.1
|
200
OK
|
9767196,9767198,9767205
Show response
ad.yieldlab.net/yp/
|
2 B
759 B
|
28ms
27ms
|
XHR
application/json |
104.111.241.250
AKAMAI-AS
|
|
|
POST
|
|
cdb
bidder.criteo.com/
|
0
0
|
|
|
|
|
|
POST
H2
|
204
|
bid
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
21ms
20ms
|
XHR
text/plain |
3.123.216.32
AMAZON-02
|
|
|
POST
H2
|
204
|
auction
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
21ms
20ms
|
XHR
text/plain |
3.123.216.32
AMAZON-02
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
3 KB
2 KB
|
65ms
64ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1682944123006514&correlator=1168119321239863&output=ldjh&impl=fif&adsid=NT&eid=21065399%2C21065305&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200207&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=1x1&ists=1&scp=as%3Dout_of_page%26adslot%3Dout_of_page%26pc%3D1%26af%3Dtickerad&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D11%26smb-hour%3D6%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26mbrid%3D5c30460156a1e9b0cfb47ecc671f68ff%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-2%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-1%252Cn153-0%252Cn11-1%252Cn120-3%252Cn154-1%252Cn125-1%252Cn8-3%252Cn2-3%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn139-0%252Cn160-0%252Cn107-0%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn49-2%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn73-2%252Cn118-6%252Cn85-0%252Cn9-2%252Cn6-1%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-0%252Cn93-3%252Cn90-1%252Cn55-1%252Cn142-0%252Cn7-1%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-2%252Cn3-1%252Cn82-0%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-0%252Cn122-2%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-1%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1581053009&dt=1581053009273&dlt=1581053008559&idt=696&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2540211652&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=75&icsg=17042684719648&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x0&msz=1x1&ga_vid=1792896362.1581053009&ga_sid=1581053009&ga_hid=378716984&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 6ce375f1d2ed60c64253438089ce21428bbf862a66656e875de6de0613eccedb
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020013001.js
Show response
securepubads.g.doubleclick.net/gpt/
|
66 KB
24 KB
|
33ms
33ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
|
0
0
|
6ms
6ms
|
Other
text/html |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
7 KB
3 KB
|
270ms
270ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1682944123006514&correlator=1168119321239863&output=ldjh&impl=fif&adsid=NT&eid=21065399%2C21065305&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200207&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C1000x150%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A20918.scenario%253Adefault%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cfullb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D11%26smb-hour%3D6%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26mbrid%3D5c30460156a1e9b0cfb47ecc671f68ff%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-2%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-1%252Cn153-0%252Cn11-1%252Cn120-3%252Cn154-1%252Cn125-1%252Cn8-3%252Cn2-3%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn139-0%252Cn160-0%252Cn107-0%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn49-2%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn73-2%252Cn118-6%252Cn85-0%252Cn9-2%252Cn6-1%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-0%252Cn93-3%252Cn90-1%252Cn55-1%252Cn142-0%252Cn7-1%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-2%252Cn3-1%252Cn82-0%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-0%252Cn122-2%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-1%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1581053009&dt=1581053009287&dlt=1581053008559&idt=696&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2257154448&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=76&icsg=17042684719648&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=1792896362.1581053009&ga_sid=1581053009&ga_hid=378716984&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 106fcc7b03094c4950370f831473afc502f2b7a087f843308a2d05000653ba05
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
7 KB
3 KB
|
433ms
433ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1682944123006514&correlator=1168119321239863&output=ldjh&impl=fif&adsid=NT&eid=21065399%2C21065305&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200207&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x40%7C10x30%7C10x20%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&scp=as%3Dsky%26adslot%3Dsky%26af%3Dfirepl%2Cwp%2Cvidwa%2Cf1x4%2Cf1x3%2Cf1x2%2Cds%2Cdds%2Csky%2Chpad%2Cband%26rfree%3D200-299%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A19051.scenario%253Adefault%26yieldlove_meta%3Dpid%253A19051.sb%253Af%26yieldlove_pid%3D19051%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%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%3D11%26smb-hour%3D6%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26mbrid%3D5c30460156a1e9b0cfb47ecc671f68ff%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-2%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-1%252Cn153-0%252Cn11-1%252Cn120-3%252Cn154-1%252Cn125-1%252Cn8-3%252Cn2-3%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn139-0%252Cn160-0%252Cn107-0%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn49-2%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn73-2%252Cn118-6%252Cn85-0%252Cn9-2%252Cn6-1%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-0%252Cn93-3%252Cn90-1%252Cn55-1%252Cn142-0%252Cn7-1%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-2%252Cn3-1%252Cn82-0%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-0%252Cn122-2%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-1%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1581053009&dt=1581053009292&dlt=1581053008559&idt=696&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2685098605&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=76&icsg=17042684719648&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=1792896362.1581053009&ga_sid=1581053009&ga_hid=378716984&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 926094f7043e6e1c12b5c9ec9c59ec4816590bd4b918bb50a447624766a96692
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
39 KB
10 KB
|
613ms
613ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1682944123006514&correlator=1168119321239863&output=ldjh&impl=fif&adsid=NT&eid=21065399%2C21065305&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200207&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A9501.scenario%253Adefault%26yieldlove_meta%3Dpid%253A9501.sb%253Af%26yieldlove_pid%3D9501%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D11%26smb-hour%3D6%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26mbrid%3D5c30460156a1e9b0cfb47ecc671f68ff%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-2%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-1%252Cn153-0%252Cn11-1%252Cn120-3%252Cn154-1%252Cn125-1%252Cn8-3%252Cn2-3%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn139-0%252Cn160-0%252Cn107-0%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn49-2%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn73-2%252Cn118-6%252Cn85-0%252Cn9-2%252Cn6-1%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-0%252Cn93-3%252Cn90-1%252Cn55-1%252Cn142-0%252Cn7-1%252Cn103-0%252Cn158-1%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-2%252Cn3-1%252Cn82-0%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-0%252Cn122-2%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-1%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1581053009&dt=1581053009296&dlt=1581053008559&idt=696&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1428895410&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=76&icsg=17042684719648&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=1792896362.1581053009&ga_sid=1581053009&ga_hid=378716984&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- b5b161b048a9187e10cb71fd01509ae371ecdbaeb4ac79c95578b00458cb8a76
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 7103
|
754 B
1 KB
|
335ms
20ms
|
XHR
application/json |
143.204.213.75
AMAZON-02
|
|
|
GET
H2
|
200
|
json
Show response
trc.taboola.com/stroeer-smb-giga/trc/3/
|
16 KB
7 KB
|
261ms
260ms
|
Script
application/javascript |
151.101.14.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=06%3A23%3A29.332<i=ab24_vTSR_C&data=%7B%22id%22%3A38%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%3A1581053008851%2C%22cv%22%3A%2220200203-21-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%22pev%22%3A1585%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%3A3718%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%3A3057.3125%2C%22mw%22%3A625%7D%5D%2C%22cb%22%3A%22TRC.callbacks.recommendations_1%22%2C%22lt%22%3A%22ab24_vTSR_C%22%7D
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20200203-21-RELEASE.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- f317ed37b629a2491e68c7a9ea50f272aba1695c79983e30b627dc1fc2db0bbe
|
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=1581053009334&ns_c=UTF-8&cv=3.5&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=1581053009334&ns_c=UTF-8&cv=3.5&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps...
|
0
528 B
|
21ms
21ms
|
Image
text/plain |
2.19.43.224
AKAMAI-ASN1
|
|
General
- Full URL
- https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1581053009334&ns_c=UTF-8&cv=3.5&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=&cs_ak_ss=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.19.43.224
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a2-19-43-224.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
setuid
ib.adnxs.com/
Redirect Chain
-
https://tracking.m6r.eu/sync/appnexusRedirect
-
https://ib.adnxs.com/setuid?entity=197&code=5c30460156a1e9b0cfb47ecc671f68ff
|
0
589 B
|
65ms
13ms
|
Image
text/html |
185.33.223.202
ASN-APPNEX
|
|
|
GET
H/1.1
|
200
OK
|
config.js
Show response
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
|
23 KB
6 KB
|
61ms
20ms
|
Script
text/javascript |
151.101.113.194
FASTLY
|
|
|
POST
|
|
v1
dmx.districtm.io/b/
|
0
0
|
|
|
|
|
|
GET
H2
|
200
|
/
Show response
d.nativendo.de/cds/delivery/get/
|
2 KB
1 KB
|
53ms
53ms
|
Script
text/javascript |
107.178.241.34
GOOGLE
|
|
|
GET
H2
|
200
|
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/
Frame 4C29
Redirect Chain
-
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstGpTiWncNezICTSIrcXElnSKOz7iO_koL17KMdrzw8l0tUGg5XCrn66NHooM4vOmLOCSOKUP2_DqPQv00aaYNwgs0YYAuC2z5UF8ZdrdGNu7wvnd2yDGOq8keliWE2wNBEYfNkV0b4J...
-
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
|
49 B
343 B
|
7ms
6ms
|
Image
image/gif |
2a02:26f0:6c00:194::5f76
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/202001101133/
|
33 KB
12 KB
|
19ms
19ms
|
Script
application/javascript |
151.101.113.194
FASTLY
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/202001101133/wrap.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.113.194
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- cf1091e08a0a0c7b7e407014d53bda0223573859d06351c958a1174479a77752
|
GET
H/1.1
|
200
OK
|
pixel
tracking.m6r.eu/consent/
|
44 B
209 B
|
28ms
28ms
|
Image
image/gif |
104.111.215.171
AKAMAI-AS
|
|
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 506D
|
0
0
|
35ms
34ms
|
Fetch
image/gif |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstoqzWDvr0ZXlrWpWmRQh6KyBzuu0jPJZKRYFx4tsZyBafs9W5GYpps3TcfcktDnHu2kO-4N7rW9-lqyAZV2MG6y9JXis2EgGcDII8k3W26d-Z4eSI643ctxt8D9-KNvIjMvTCj3XZ5nXGj2j9he4O8XpQZSupZwAs3AYyiq-KZArLPH3MMZ5JEW5iYZuB8N7djAga-FOMzUKlFsyFL1MuMSOdfDeKBfW1ZhKXo56SMLUdRaoSNihwW1t03gD2iOtPkjJLCTPS7X6XwY4_2nw&sig=Cg0ArKJSzHLI9jbJLLvTEAE&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.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
Frame 506D
|
44 KB
15 KB
|
15ms
14ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 506D
|
72 KB
27 KB
|
16ms
15ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- b424ec6465b6e0dd6e6b9ece3fa59da2a273e14ce3cebfd444ad5b661fba16b8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
4766719661
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
47 B
251 B
|
241ms
29ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
tb
Show response
15.taboola.com/
|
31 KB
32 KB
|
326ms
35ms
|
Script
text/html |
151.101.14.49
FASTLY
|
|
General
- Full URL
- https://15.taboola.com/tb?oid=15&pubnm=stroeer-smb-giga&unitType=244&tbloc=&pageType=text&pstn=Below%20Article%20Feed%20-%20Video&uuip=Feed%20-%20Below%20Article%20Feed%20-%20Video&cisrf=&cirf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&encoded=1&uid=f5ee95ac-23e2-4096-9c69-8f80398bc8c2-tuct53679d1&variant=472630|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1581053009610&tagid=&cntry=NL&platform=1&sesid=88694442d0169d0f7c4eea1476454cde&itemid=/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme&viewid=1581053008851&geolat=&geoing=&deviceifa=&appid=&sd=v2_88694442d0169d0f7c4eea1476454cde_f5ee95ac-23e2-4096-9c69-8f80398bc8c2-tuct53679d1_1581053009_1581053009_CNawjgYQrMVBGNO36fCBLiABKAEwoQE4l-oLQJqXEEjoxI8BUP___________wFYAGAA&ri=da379159c6a325179d87cda298444680&appname=&cdb=&gdprApplies=&rid=&sii=333075201540415599&oee=true&tpubid=1073836
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20200203-21-RELEASE.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 1ea9327dbb5c960c02e7d68354ecb7d92e02dfa07d09c03c5dadbc7f1d3eff55
|
GET
H2
|
200
|
feed-card-placeholder.20200203-21-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
5 KB
2 KB
|
20ms
19ms
|
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
|
20ms
20ms
|
Image
image/svg+xml |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
200
|
userx.20200203-21-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
22 KB
8 KB
|
20ms
20ms
|
Script
application/javascript |
151.101.14.2
FASTLY
|
|
|
GET
|
|
sync
rtb.mfadsrvr.com/
Frame B004
|
0
0
|
|
|
|
|
|
GET
|
|
sync.php
pixel.rubiconproject.com/exchange/
Frame B004
|
0
0
|
|
|
|
|
|
GET
|
|
identify
px.powerlinks.com/user/
Frame B004
|
0
0
|
|
|
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/
Frame B004
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://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID]&mm_bnc&mm_bct&UUID=3efc5e3c-f456-4500-b2bd-4f1bdea7cfb2
-
https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=3efc5e3c-f456-4500-b2bd-4f1bdea7cfb2
|
0
178 B
|
28ms
28ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
204
|
/
trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/
Frame B004
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=HHp1TgDGuRjI&ev=1&pid=562107
|
0
63 B
|
30ms
29ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=HHp1TgDGuRjI&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, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
204
|
/
trc.taboola.com/sg/rtbhouse-network/1/rtb-h/
Frame B004
Redirect Chain
-
https://creativecdn.com/cm-notify?pi=taboola
-
https://ams.creativecdn.com/cm-notify?pi=taboola&tc=1
-
https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=WKrcYWoKeiiI5BV5oMH9&pi=taboola&tc=1
|
0
50 B
|
28ms
28ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=WKrcYWoKeiiI5BV5oMH9&pi=taboola&tc=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
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
getuidnb
ib.adnxs.com/
Frame B004
|
43 B
691 B
|
14ms
13ms
|
Image
image/gif |
185.33.223.202
ASN-APPNEX
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/google-network/1/rtb-h/
Frame B004
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=CAESEOaEC1GsD0fkudydzjBm3iE&google_cver=1
|
0
60 B
|
29ms
28ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEOaEC1GsD0fkudydzjBm3iE&google_cver=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
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
getuidnb
ib.adnxs.com/
Frame B004
|
43 B
691 B
|
27ms
13ms
|
Image
image/gif |
185.33.223.202
ASN-APPNEX
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/thetradedesk-network/1/rtb-h/
Frame B004
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=80a4a37c-84ac-43de-8063-55e91d4ca3ad
|
0
201 B
|
28ms
28ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=80a4a37c-84ac-43de-8063-55e91d4ca3ad
- 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, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
trc.taboola.com/sg/storygize-network/1/
Frame B004
Redirect Chain
-
https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=f5ee95ac-23e2-4096-9c69-8f80398bc8c2-tuct53679d1
-
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
|
0
201 B
|
28ms
28ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
- 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, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
cookiesync
bttrack.com/pixel/
Frame B004
|
35 B
380 B
|
394ms
101ms
|
Image
image/gif |
192.132.33.46
BIDTELLECT
|
|
|
GET
H/1.1
|
204
No Content
|
/
cds.taboola.com/
Frame B004
|
0
176 B
|
526ms
92ms
|
Image
text/plain |
141.226.224.32
TABOOLA-AS
|
|
|
GET
H2
|
200
|
/
trc.taboola.com/sg/bidswitch-network/1/rtb-h/
Frame B004
Redirect Chain
-
https://x.bidswitch.net/sync?ssp=taboola
-
https://x.bidswitch.net/ul_cb/sync?ssp=taboola
-
https://dm.hybrid.ai/bidswitch-match?ssp=taboola
-
https://x.bidswitch.net/sync?dsp_id=258&user_id=8447f7d93410af185141&expires=30&ssp=taboola
-
https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=9d278f0d-277e-430b-9cad-f630f60a1768
|
0
57 B
|
28ms
28ms
|
Image
text/plain |
151.101.14.2
FASTLY
|
|
General
- Full URL
- https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=9d278f0d-277e-430b-9cad-f630f60a1768
- 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, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:824::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j80&aip=1&a=378716984&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=6GBAAEAB~&jid=&gjid=&cid=1792896362.1581053009&tid=UA-204785-4&_gid=1740020295.1581053009&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=&cm73=1&cm13=1&z=445421263
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
Frame 7103
|
199 KB
58 KB
|
22ms
22ms
|
XHR
application/javascript |
143.204.213.75
AMAZON-02
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
383 B
|
28ms
28ms
|
XHR
image/gif |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
200
|
pubads_impl_2020013001.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 506D
|
167 KB
61 KB
|
33ms
33ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame 506D
|
113 B
178 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
57 B
|
29ms
29ms
|
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
|
30ms
30ms
|
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
|
29ms
29ms
|
XHR
image/gif |
151.101.14.2
FASTLY
|
|
|
GET
H2
|
200
|
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
|
254 B
763 B
|
20ms
19ms
|
Image
image/png |
151.101.14.2
FASTLY
|
|
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 7103
|
199 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame B75E
|
0
0
|
36ms
35ms
|
Fetch
image/gif |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvvz4S_myS32Gybl3tj46Ympx8Cv_gvw-kbh2CQ8JEKHBJ0gpiv1OhAhU_brwW6nJlapBVWpPTqtE7qtips4aJHN_9cukR4Enxcx0XmuVnmPtHrRi779h5so4rd6zqf-QfsD-x47jaR-YxMVNN4u0hNGIZH1M6o-I2EcLypAkb57sBhoK_xTlv2GiP6sMo-iDgU6a355CHuaQQKBIZt7pZPVNvt9j9QCWU63-gvkYjSg2ma0Jl9ml3F3wiOnYmhmEC3K1F4xUsG8oGR2-FB1g&sig=Cg0ArKJSzPUrbX1S93xWEAE&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.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
Frame B75E
|
44 KB
15 KB
|
16ms
16ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame B75E
|
72 KB
27 KB
|
15ms
14ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- b424ec6465b6e0dd6e6b9ece3fa59da2a273e14ce3cebfd444ad5b661fba16b8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
4765983595
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
47 B
252 B
|
60ms
20ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 506D
|
19 KB
8 KB
|
300ms
300ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1451028061693406&correlator=3861414760974278&output=ldjh&impl=fif&eid=21064169%2C21065304&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200207&iu=%2F5286166%2Fgiga.de%2FDFP-Passback-728x90&sz=728x90&eri=6&cookie=ID%3D2fd0ab69a0701c5d%3AT%3D1581053009%3AS%3DALNI_MaeK6lPUfxlCiE0papQCIpPozUejw&cdm=www.giga.de&bc=31&abxe=1&lmt=1581053009&dt=1581053009771&dlt=1581053009578&idt=188&ea=0&frm=23&biw=1585&bih=1185&isw=728&ish=90&oid=3&adx=429&ady=125&adk=4143599050&uci=d6ikhukqolq&ifi=1&ifk=215055865&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&top=www.giga.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=1792896362.1581053009&ga_sid=1581053010&ga_hid=280434545&fws=256&ohw=0&btvi=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- b45f4d64300b5a7afb8845b86919326bb36694ba43fc88096a9f743b75ac43ee
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020013001.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 506D
|
66 KB
24 KB
|
35ms
34ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame 506D
|
0
0
|
6ms
6ms
|
Other
text/html |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
DATA
|
200
OK
|
truncated
/
Frame 506D
|
211 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
pubads_impl_2020013001.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame B75E
|
167 KB
61 KB
|
33ms
33ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame B75E
|
113 B
175 B
|
15ms
14ms
|
Script
application/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
data
lb15.s400.meetrics.net/
|
43 B
308 B
|
24ms
23ms
|
Image
image/gif |
136.243.33.84
HETZNER-AS
|
|
General
- Full URL
- https://lb15.s400.meetrics.net/data?/rbRDDVLAAKktFLkqFFlqwF23A52AwwA/k0FMEmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AxwA1zAwwA50Ax4ALlnFBUkzF2BP5EAAAAAAABoitAPAAAFAAoitTA5iAPBAAAAAG6ABA5iAZAAAOA55A55A85B55A58E55A55AGAx4A21Az2ArA5iAPDAAAAAG6AHA5iAPuEAAAANPBKA5iASksFbFjAAAAAAAAAAAAEAAAoitAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0fFvmFfwFhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0fFvmFfwFhnFlBFdAAAG6AxYAAAAFAAAA5iAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjF+p6OUA
- 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.33.84
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h381.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
b33ddd25-62e9-4968-83f4-c8bc70239a02
Show response
t.nativendo.de/cds/tracking/event/
|
0
179 B
|
31ms
29ms
|
Script
text/javascript |
107.178.241.34
GOOGLE
|
|
|
GET
H2
|
200
|
b33ddd25-62e9-4968-83f4-c8bc70239a02
Show response
t.nativendo.de/cds/tracking/event/
|
0
181 B
|
29ms
28ms
|
Script
text/javascript |
107.178.241.34
GOOGLE
|
|
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
20ms
20ms
|
XHR
text/plain |
3.123.216.32
AMAZON-02
|
|
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
20ms
20ms
|
XHR
text/plain |
3.123.216.32
AMAZON-02
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame B75E
|
19 KB
8 KB
|
297ms
297ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1034792609471918&correlator=2924045049926172&output=ldjh&impl=fif&eid=21065377%2C21065400%2C21064549%2C21065380%2C21065390%2C21065304&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200207&iu=%2F5286166%2Fgiga.de%2FDFP-Passback-300x600&sz=120x600%7C160x600%7C300x600&eri=6&cookie=ID%3D2fd0ab69a0701c5d%3AT%3D1581053009%3AS%3DALNI_MaeK6lPUfxlCiE0papQCIpPozUejw&cdm=www.giga.de&bc=31&abxe=1&lmt=1581053009&dt=1581053009848&dlt=1581053009761&idt=83&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=600&oid=3&adx=1318&ady=125&adk=2714360146&uci=29qk72d7ly37&ifi=1&ifk=1958905618&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&top=www.giga.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x600&msz=300x600&ga_vid=1792896362.1581053009&ga_sid=1581053010&ga_hid=202492430&fws=256&ohw=0&btvi=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- bf7be644d8d5f638a574c7487a93b81a72d0337eef2e56533bb13213b0811345
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020013001.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame B75E
|
66 KB
24 KB
|
34ms
34ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame B75E
|
0
0
|
6ms
5ms
|
Other
text/html |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
DATA
|
200
OK
|
truncated
/
Frame B75E
|
212 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=5c30460156a1e9b0cfb47ecc671f68ff&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D5c30460156a1e9b0cfb47ecc671f68ff%2...
-
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=5c30460156a1e9b0cfb47ecc671f68ff&userId=adscale-user:ec4b7b0cdad443c3a135970a836f83dd
|
44 B
574 B
|
97ms
96ms
|
Image
image/gif |
104.111.215.171
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=XDBGAVah6bDPtH7MZx9o_w
-
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
|
44 B
569 B
|
31ms
31ms
|
Image
image/gif |
104.111.215.171
AKAMAI-AS
|
|
|
GET
H/1.1
|
204
No Content
|
m
ad.yieldlab.net/
Redirect Chain
-
https://tracking.m6r.eu/sync/yieldlabRedirect
-
https://ad.yieldlab.net/m?dt_id=36356&ext_id=5c30460156a1e9b0cfb47ecc671f68ff
|
0
360 B
|
25ms
25ms
|
Image
text/plain |
104.111.241.250
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
data
lb15.s400.meetrics.net/
|
43 B
308 B
|
24ms
23ms
|
Image
image/gif |
136.243.33.84
HETZNER-AS
|
|
General
- Full URL
- https://lb15.s400.meetrics.net/data?/rbRDEiMAA/k0FRImvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AxwA1zAwwA50Ax4AmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A23Ax5A22AxmAjpFk9BxzA4yA2wA5wAy2A13AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF90A32A23Ax5A22AxmAhwFk9B03A22A3xA52A2xAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4xAw1AzwAw5A4xA0BELlnFCUkzFYBPaBAAAAAAABwPeAPAAAFAAwPeTl5/APAAAtGA9BABl5/AZAAAOA55A55A85B55A58E55A55AGAxyAz4A44Arl5/ASksFMFjAAAAAAAAAAAAEAAAwPeAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFGA3yA44E5wAMAxzA4yA2wA5wAy2A13AGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA03A22A3xA52A2xAGAihFuuFlyFKA03A22A3xA52A2xAKA03A22A3xA52A2xAwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFdtGA9BAYLAaBAFAAAl5/AAAAALAT1FwlFyCFhuFulFyBFAAAAAAAAAAAAAAAAQtjFF2G9VA
- 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.33.84
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h381.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
amp4ads-host-v0.js
Show response
cdn.ampproject.org/rtv/012001251659540/
|
20 KB
7 KB
|
10ms
9ms
|
Script
text/javascript |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://cdn.ampproject.org/rtv/012001251659540/amp4ads-host-v0.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 43869e57b9339b03aecd3da7938097421e238ae9bdfd42a64035cc17c86399e0
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/esm/ https://cdn.ampproject.org/lts/ https://cdn.ampproject.org/mp/ https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/sp/ https://cdn.ampproject.org/sw/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0.mjs https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
amp4ads-v0.js
Show response
cdn.ampproject.org/rtv/012001251659540/
Frame 991B
|
200 KB
55 KB
|
24ms
6ms
|
Script
text/javascript |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://cdn.ampproject.org/rtv/012001251659540/amp4ads-v0.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 385bf60b00ac86347e623110798bf340dac6a124146c034cf58ff596525f38a3
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/esm/ https://cdn.ampproject.org/lts/ https://cdn.ampproject.org/mp/ https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/sp/ https://cdn.ampproject.org/sw/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0.mjs https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
amp-ad-exit-0.1.js
Show response
cdn.ampproject.org/rtv/012001251659540/v0/
Frame 991B
|
15 KB
6 KB
|
9ms
8ms
|
Script
text/javascript |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://cdn.ampproject.org/rtv/012001251659540/v0/amp-ad-exit-0.1.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- dc0d3b44a4cbe769eca3a48f9470f911bf3f4e65f1650b2eecea7ed2942eada6
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/esm/ https://cdn.ampproject.org/lts/ https://cdn.ampproject.org/mp/ https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/sp/ https://cdn.ampproject.org/sw/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0.mjs https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
amp-analytics-0.1.js
Show response
cdn.ampproject.org/rtv/012001251659540/v0/
Frame 991B
|
91 KB
27 KB
|
7ms
6ms
|
Script
text/javascript |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://cdn.ampproject.org/rtv/012001251659540/v0/amp-analytics-0.1.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 30f825366b29e0c783fd4416f9729fec0e5900cf115de79d2a628fb21d7df7b4
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/esm/ https://cdn.ampproject.org/lts/ https://cdn.ampproject.org/mp/ https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/sp/ https://cdn.ampproject.org/sw/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0.mjs https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
amp-fit-text-0.1.js
Show response
cdn.ampproject.org/rtv/012001251659540/v0/
Frame 991B
|
3 KB
1 KB
|
11ms
10ms
|
Script
text/javascript |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://cdn.ampproject.org/rtv/012001251659540/v0/amp-fit-text-0.1.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e548c1ce78f73067beca7f7e2bb284f7a79a0e537c7ebb48266560290fcfbe66
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/esm/ https://cdn.ampproject.org/lts/ https://cdn.ampproject.org/mp/ https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/sp/ https://cdn.ampproject.org/sw/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0.mjs https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
amp-form-0.1.js
Show response
cdn.ampproject.org/rtv/012001251659540/v0/
Frame 991B
|
46 KB
15 KB
|
10ms
9ms
|
Script
text/javascript |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://cdn.ampproject.org/rtv/012001251659540/v0/amp-form-0.1.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- cda09677337093b10da14ba0ecbed2ea647ecec1f327ff794a046e3a71083fd4
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/esm/ https://cdn.ampproject.org/lts/ https://cdn.ampproject.org/mp/ https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/sp/ https://cdn.ampproject.org/sw/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0.mjs https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
DATA
|
200
OK
|
truncated
/
Frame 991B
|
211 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
2612180225604269445
tpc.googlesyndication.com/daca_images/simgad/
Frame 991B
|
14 KB
14 KB
|
7ms
6ms
|
Image
image/png |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/daca_images/simgad/2612180225604269445
- 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::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 5fddc1a27a5b42f49c06fd8f187de93b856030b9adfc8b7fd78df3fc1c43c72a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
de.png
tpc.googlesyndication.com/pagead/images/adchoices/
Frame 991B
|
3 KB
3 KB
|
6ms
6ms
|
Image
image/png |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/images/adchoices/de.png
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 8471f381394962167d7d0cbbd9ffbd1f19d3ef6c48a7d9e3209142e674481368
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
icon.png
tpc.googlesyndication.com/pagead/images/adchoices/
Frame 991B
|
295 B
401 B
|
7ms
6ms
|
Image
image/png |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/images/adchoices/icon.png
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 7fd59024b6ca83f11f7a3448ec148309a13b705725716df134f699e60a96eb1b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
l
www.google.com/ads/measurement/
Frame 991B
|
0
0
|
14ms
13ms
|
Image
text/html |
2a00:1450:4001:81a::2004
GOOGLE
|
|
General
- Full URL
- https://www.google.com/ads/measurement/l?ebcid=ALh7CaStcJBLuDPujGtiSiW-ZcoUD2c7YGxEgQ90FB3pknfJ_wDtHpLD4FuQBBp061ay8wsQ19MdjWfOI5IeVIvMW6J9KepxBg
- 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:81a::2004
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
adview
securepubads.g.doubleclick.net/pagead/
Frame 991B
|
0
0
|
36ms
35ms
|
Image
text/html |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pagead/adview?ai=CxZMCUfQ8XvGuK5jC7gOmoZaABZSpwcdbk4Cuvs0JjcqQh7sZEAEgjvP0E2CRhICAiBigAaO8pOcCyAECqQLoW6harECpPuACAKgDAcgDCKoEqwJP0OGIBpo6K_1kzxU36cfBbeKpD2FXkBfewD9L7ZuJqVLasUkxJ_GC5omJ8RDlHCzyzvuzOPRkb6P8o8grzycDUnSeNdoHujRvxKVfn6Md8wyC0iL71INJpnSEztZC9FUvuNdwumALeGOvWGVxq1hLJVulnenWXV1D5WjIgt7N8wIKoLhRs36sdqucmKte7RewGIbTSskeG9vJ9NeM-wN6gKTZxgfPtZdI6sNrctZbaHR1lBf3tv7BVSTl9YvDbddUPriDX7YeRy2_GJZl5-d2pzNMdTYumXsMrm2dMiCaMNJU6ny7wZ7pubuuiz6LlS52_uKrQN-QSexm4KyDKpqM7GshuuSnsJ2mSx3AAIzi1NOtGYGwfSjuI4PiG6OA90aBdT7cQdxiMcqo-MAE-5TxxIYC4AQBkgUECAQYAZIFBAgFGASgBgKAB8XD25gBqAeOzhuoB9XJG6gHk9gbqAe6BqgH8tkbqAemvhuoB-zVG9gHAfIHAhAT0ggJCIDhgBAQARgdgAoDyAsB2BMM&sigh=UZmt8Llut-Y&tpd=AGWhJmutfvW6L-Kyf_MgTwnK7dKP5GiJpfHJm3gkwUR8mJT11A
- 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.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
20ms
20ms
|
XHR
text/plain |
3.123.216.32
AMAZON-02
|
|
|
GET
H2
|
200
|
creative_js.js
Show response
vidstat.taboola.com/vpaid/units/27_2_17/creatives/
|
4 KB
2 KB
|
1077ms
18ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame 924D
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 506D
|
74 KB
27 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 18f31e7cf5554306ac5bf2bd314fb4aeb32cbf5379c8f6a0e156e5990b1b00ff
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
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 7103
|
53 B
703 B
|
23ms
23ms
|
XHR
application/json |
52.219.74.191
AMAZON-02
|
|
General
- Full URL
- https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=9127775750
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGt1aVNoaXNoV3VzaG9kb289a3VpU2hpc2hXdXNob2Rvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cubWZ8fCh3Lm1mPTApO3cubWYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5tZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZighbCl1YyhlYSw1MCk7ZWxzZSBpZighZS5wbil7bC5wYXVzZUJ1dHRvbnx8KGwucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLm11dGVCdXR0b258fChsLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbC5za2lwYWJsZUJ1dHRvbnx8KGwuc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTtsLnNraXBCdXR0b258fChsLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobC5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtsLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxtKX0pfW0uZyhsLmdsb2JhbENvbmZpZyxsLmNsaWVudENvbmZpZyxsLnByZWNoZWNrZWQsbC5vblJlYWR5LGwub25GYWlsdXJlLGwpO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPWwuc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHQoYyxhKXtpZihlLmJsKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkVjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP20uSWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZmE7Yi5CZihjKTtiLlduKG0pO2IuVm4obCk7Yi5LbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKG0ud2IubGVuZ3RoKXt2YXIgYj1tLndiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGc7Zz1lLmNvKHsiW0xPQURTQ1JJUFRdIjplLlkoMTApLCJbVVRJTFNdIjplLlkoMTApLCJbQ0FMTEJBQ0tdIjplLlkoMTApfSk7d2luZG93W2dbIltMT0FEU0NSSVBUXSJdXT1lLkRoLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBnIGluIGIpbFtnXT1iW2ddO3QoYyxhKX07Zz1iLnNjcmlwdHMuc2hpZnQoKTspZS5EaChnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxtKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmNrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5ibD0hMTt0aGlzLkpiPSJzZXR1cCI7dGhpcy5XYz1bXTt0aGlzLnplKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMud24uYmluZCh0aGlzKSk7dGhpcy5xYj17fTt0aGlzLnBoPXt9O3RoaXMueWY9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt1bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5xYlthXSsiXyIpO3JldHVybiBifSxqYzpmdW5jdGlvbigpe3RoaXMueWZ8fCh0aGlzLnlmPWUuWSgxMCkpO3JldHVybiB0aGlzLnlmfSxyYjpmdW5jdGlvbihiKXt0aGlzLnFiW2JdfHwodGhpcy5xYltiXT0wKTt0aGlzLnFiW2JdKz0xOzU8dGhpcy5xYltiXSYmIXRoaXMucGhbYl0mJih0aGlzLnBoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudW8oKSwhMCkpfSx6ZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFRrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGxhOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSx3bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy52bihiLmRhdGEpfSx2bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx1ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LExnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmVoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5FZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGVoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFJrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUuTmwoYikpcmV0dXJuOyhhPXRoaXMuTGcoYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE5sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxWZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sSW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sTWU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZGg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LGZvOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sRGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy54bChhKSxmPTA7ZjxkLmxlbmd0aDtmKyspdGhpcy5mbyhiLGRbZl0ua2V5LGRbZl0udmFsdWUpfSxkbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0seGw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9mPWNbMV0udHJpbSgpOmY9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLmRsKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpmfTthLnB1c2goZCl9cmV0dXJuIGF9LEtmOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHloOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFZlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxmPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2Y9aC5oZWlnaHQ7MD5oLnRvcCYmKGYrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZik7Yz49YSYmKGU9ITApO3JldHVybiBlfSxXZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlZlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldlKGIpfS5iaW5kKHRoaXMpLDEwMCl9LE9iOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxPZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZjtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylmPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2YsYXw9MDtyZXR1cm4gYX0sRWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWI+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBmLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx4PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1iLmNoYXJDb2RlQXQoZik8PDI0fGIuY2hhckNvZGVBdChmKzEpPDwxNnxiLmNoYXJDb2RlQXQoZisyKTw8OHxiLmNoYXJDb2RlQXQoZiszKSxyLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZik7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cltiKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWg7bD14O3k9azt0PW07Zm9yKGY9MDsxOT49ZjtmKyspcT1kKHAsNSkrKG4mbHx+biZ5KSt0K2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7Zm9yKGY9MjA7Mzk+PWY7ZisrKXE9ZChwLDUpKyhuXmxeeSkrdCtjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1sLGw9ZChuLDMwKSxuPXAscD1xO2ZvcihmPTQwOzU5Pj1mO2YrKylxPWQocCw1KSsobiZsfG4meXxsJnkpK3QrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bCxsPWQobiwzMCksbj1wLHA9cTtmb3IoZj02MDs3OT49ZjtmKyspcT1kKHAsNSkrKG5ebF55KSt0K2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3g9eCtsJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeCkrYShrKSthKG0pKS50b0xvd2VyQ2FzZSgpfSxDYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxmLHAsYyxlLGgseD0wO3g8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHgrKyksZj1iLmNoYXJDb2RlQXQoeCsrKSxwPWIuY2hhckNvZGVBdCh4KyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZik/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx2ZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGg9ITEseD0hMSxrPSExLGw9ITE7dHJ5e2E9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuZGM/ITA6ITF9Y2F0Y2godCl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSx4PSFoJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0oa3x8cCkmJiEhd2luZG93LkNTU31jYXRjaChxKXt9Yi5pc1BoYW50b21KUz1hO2IuaXNDaHJvbWVIZWFkbGVzcz1kO2IuaXNGaXJlZm94SGVhZGxlc3M9ZjtiLmlzT3BlcmE9cDtiLmlzRmlyZWZveD1jO2IuaXNTYWZhcmk9ZTtiLmlzSUU9aDtiLmlzRWRnZT14O2IuaXNDaHJvbWU9aztiLmlzQmxpbms9bDtyZXR1cm4gYn0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj17S2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCnNtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LFVqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxKajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LGprOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sWWs6ZnVuY3Rpb24oKXtyZXR1cm4gYi5LaSgpfHxiLlVpKCl8fGIuc20oKXx8Yi5VaigpfHxiLkJrKCl8fGIuSmooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuWWsoKX0sU2w6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGY9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZlsxXSkpcmV0dXJuIGQ9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhhKXx8W10sIklFICIrKGRbMV18fCIiKTtpZigiQ2hyb21lIj09PWZbMV0mJihkPWEubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1kKSlyZXR1cm4gZC5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtpZighYilyZXR1cm4gZlsxXTtmPWZbMl0/W2ZbMV0sZlsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShkPWEubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZi5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBmLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFthW2ZdXT1iW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxnKXthJiYoZC5xdWVyeUtleVthXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZj0wLHA9Yi5sZW5ndGg7ZjxwOysrZilhLmhhc093blByb3BlcnR5KGJbZl0pfHwoZC5wdXNoKGJbZl0pLGFbYltmXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sZm06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxmLnB1c2goYltwXSk7cmV0dXJuIGZ9LG1vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZj0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhmPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmYpOihkPWIuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LFpnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEFmOmZ1bmN0aW9uKGIpe3RoaXMuSmI9Yn0sV2c6ZnVuY3Rpb24oYixhLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5KYjt0aGlzLnJlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsCmQpKSxiLmRpc3BhdGNoRXZlbnQoZil9Y2F0Y2gocCl7dGhpcy5wbj0hMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEhjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5XZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHo9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih6PWsuU2EoYixhKSk7ZiYmKHo9ay5TYSh6LGYpKTtwJiYoej1rLlNhKHoscCkpO2MmJih6PWsuU2EoeixjKSk7aCYmKHo9ay5TYSh6LGMpKTtlLkhjKHopfSx5bjpmdW5jdGlvbihiKXt2YXIgYT17fTsKaWYoIWIuY29kZSlyZXR1cm4hMTtpZihiLnNwZWNpYWxfdHJhY2t8fGIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmZtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPQpiLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LG5vOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5qYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMucmUoYil9LHJlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMueW4oYik7aWYoYSlpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uU2MoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjsKYi5kYXRhLmhvbWFkX2F0PWE7bS5KYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGY9bS5TYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5KYShmLGZ1bmN0aW9uKGQpe3ZhciBmPQohMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxXZDpmdW5jdGlvbihiKXtpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGEsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uU2MoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLkphKGIpfX0sZGY6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uamwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGYoKX0uYmluZCh0aGlzKSwKNTAwKX0sS2U6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnBiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxOZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0scGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5BZChiKToiIn0sQWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5OZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHhnOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5YZShiKXx8dGhpcy5JbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LndmJiZ3aW5kb3cuc2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5WZyhiKSlyZXR1cm4gdGhpcy5WZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQ2IoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPQohMTtkPSExO2Q9dGhpcy5iYihiLGEuQWEsYyxmdW5jdGlvbihiKXtlPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWEuQ2QoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUmsoZSxiKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYixhLGQsZixjLGUsaCx6KXt2YXIgaz1lfHxtO2U9ITA7eiYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWUuZGF0YVt0XT1kW3RdO3JldHVybiBrLkphKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmIoYixhLGQsZixjLGssaCx6KX0uYmluZCh0aGlzKSw1MDApfSxFZDpmdW5jdGlvbihiLGEsZCxmLGMsZSxoKXt2YXIgaz0hMDtoJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIHggaW4gaClkKz0iJiIreCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbeF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUm06ZnVuY3Rpb24oYixhLGQpe3RoaXMuRWQoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuV2MpZm9yKHZhciBjIGluIHRoaXMuV2MpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5XY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuQ2IoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxEaDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkNiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5iYihiLGYuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlJtKGYuQ2QoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LGNvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLldjPWJ9LHRwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5iYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxaazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LEJtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylpZihhW2ZdPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnBqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZW49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuRmw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnFnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmlnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5uZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5yZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSms9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLmxnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuV289e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmRuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkdsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5xcD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnZsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEucWQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5FYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EucGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkxrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5mZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Eub2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EucWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLktrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5obj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkZkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlFmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5JZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuUm89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5mbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLklsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e09lOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZixjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBNYXRoLmFicyhhKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk9hfHwieCIpfSxibTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuT2F8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHlkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy55ZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLnlkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5PZSh0aGlzLmphKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMueWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHdtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHdoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLk9lKHRoaXMuYm0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy55ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnZqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChnW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5nP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy50bXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5LYT17fTt0aGlzLkY9bnVsbDt0aGlzLlRjPTEwMDt0aGlzLlBiPTA7dGhpcy5WYT0xNTA7dGhpcy5WYj0wO3RoaXMuWG4oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlBiPD10aGlzLlZhPyh0aGlzLlBiKyssdGhpcy5WYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlRjKSk6MD50aGlzLlZhJiYodGhpcy5WYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlRjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGI+dGhpcy5WYT8hMDohMX0sdmY6ZnVuY3Rpb24oKXt0aGlzLlBiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuS2FbYS5qYSgpXT0KYTtMJiZMLkNoJiZMLnRvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBlLk1lKHRoaXMuS2EpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLkthKWlmKGI9PXRoaXMuS2FbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuS2FbYS5qYSgpXT8hMDohMX0sQ206ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuS2EpaWYoYS5pZD09dGhpcy5LYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx0cTpmdW5jdGlvbihhKXt0aGlzLkthW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLlpqfHxxOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuVGM9MTA7dGhpcy5QYj0wO3RoaXMuVmE9NTA7dGhpcy5WPW51bGw7dGhpcy5nYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuSWI9IiI7dGhpcy5OZz0hMTt0aGlzLkooKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGc9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZylhLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxMYTpmdW5jdGlvbigpe30saW86ZnVuY3Rpb24oYSl7dGhpcy5WPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVn0sWm46ZnVuY3Rpb24oYSl7dGhpcy5nZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdmfSxmZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuUGI8PXRoaXMuVmEmJih0aGlzLlBiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5UYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sTWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx2cTpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk5rKCk7dGhpcy5NZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxOazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5ZKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFRlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYX0sWDpmdW5jdGlvbigpe3RoaXMuZ2E9ITB9LFVjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxhZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLkliPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5JYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuSWImJihhPSEwKTtyZXR1cm4gYX0scXE6ZnVuY3Rpb24oKXt0aGlzLk5nfHwodGhpcy5OZz0hMCl9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5KaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmZnPSIxIjt0aGlzLmdnPSIyIjt0aGlzLkdrPSIzIjt0aGlzLmJkPTA7dGhpcy5abT0zMDt0aGlzLlpiPVtdO3RoaXMua2I9W107dGhpcy50Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5zZz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuYmQ7dGhpcy5pZD1lLlkoMTApO3RoaXMuQmYoYSk7dGhpcy5ZbihiKX0sZjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxlLmRmKCkpfSxKaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEubWMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmphKCldfHwod2luZG93W2IuZmEoKV1bYS5qYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmphKCldLmluaXRpYXRvcj1lLmpjKCkpO3dpbmRvd1tiLmZhKCldW2EuamEoKV1bZS5qYygpXT93aW5kb3dbYi5mYSgpXVthLmphKCldW2UuamMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmphKCldW2UuamMoKV09MX0sem06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSTt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5qYSgpXSYmd2luZG93W2cuZmEoKV1bYS5qYSgpXS5pbml0aWF0b3IhPWUuamMoKSYmKHRoaXMuQ2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnZtKCk7CmlmKCF0aGlzLnptKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkNmKCk7cmV0dXJufXRoaXMuQ2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxnKTt0aGlzLnBpKCk7dGhpcy5zZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5aYi5wdXNoKGEpLHRoaXMua2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5aYiYmMDx0aGlzLlpiLmxlbmd0aCYmKHRoaXMuWmI9ZS51bmlxdWUodGhpcy5aYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWmIuam9pbigiLCIpKSk7aWYodGhpcy5rYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmtiLmxlbmd0aDtnKyspdGhpcy50Y1t0aGlzLmtiW2ddLnJlYXNvbl09PXRoaXMudGNbYV0mJmIucHVzaCh0aGlzLmtiW2ddLmRldGFpbCksdGhpcy50Y1t0aGlzLmtiW2ddLnJlYXNvbl08CnRoaXMudGNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmtiW2ddLmRldGFpbCksYT10aGlzLmtiW2ddLnJlYXNvbik7dGhpcy50Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihnPWUudW5pcXVlKGIpLGE9YSsiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmZnfSxDZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuZ2d9LGVvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ha30sbWE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkfSxrZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5mZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuZ2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmJkfSxCZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxZbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuSml8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5ybnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuZWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVShhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZWp8fG9hOyhmdW5jdGlvbihjKXtjLmZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmZqfHxwYTsoZnVuY3Rpb24oYyl7Yy5naj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuZ2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkJsfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm1oPXRoaXMuc2I9ITE7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubWg9ITApO3RoaXMuTWg9ITE7dGhpcy5VZygpO3RoaXMuSGUoKTt0aGlzLnVsPSExfSxVZzpmdW5jdGlvbigpe3RoaXMuc2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnNiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk1oPWE7aWYodGhpcy5taCl7dGhpcy5IZSgpO2lmKHRoaXMuc2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxIZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNiKXt2YXIgYT10aGlzLk1oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMuc2I9ITApO3RoaXMuVShiKX19LExhOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuT2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLk9kKGIpfS5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmdmJiYoMCx0aGlzLmdmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LEplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Canx8c2E7KGZ1bmN0aW9uKGMpe2MuQWo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG1hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5iZDt0aGlzLmlzUGxheWluZz10aGlzLm5lPSExO3RoaXMucGU9MTt0aGlzLmNkPVtdO3RoaXMuQmI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLm5lPSExO3RoaXMucGU9MTt0aGlzLmNkPVtdO3RoaXMuQmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5wZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkJiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGc9MDtnPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2crKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ddLnRhZyl7dGhpcy5CYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkJiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkJiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuQmI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPApkLmxlbmd0aDtnKyspYS5vbihkW2ddLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZ10mJih0aGlzLm5lPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZ10mJnRoaXMuSmgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5abSYmIXRoaXMuemEoKSYmKHRoaXMuQmI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubWEoKSx0aGlzLmdldFBsYXllcigpLnVsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuSWI7YiYmKGIuSGQoKSxiLnJkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5jZC5pbmRleE9mKGIpJiZ0aGlzLmNkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuaWEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5jZC5sZW5ndGg+PXRoaXMucGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5HZT90aGlzLkdlKys6dGhpcy5HZT0xOnRoaXMuRmU/CnRoaXMuRmUrKzp0aGlzLkZlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLktmKGIudmlkZW9UYWcpP2Iuc2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5uZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuRmU+dGhpcy5HZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlVnKCksYi5IZSgpLGIuc2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Banx8dGE7KGZ1bmN0aW9uKGMpe2MuQ2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5XbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpnLnNifHx0aGlzLk0oZyl8fHRoaXMuQ20oZyl8fCh0aGlzLk4oZyksZz1uZXcgdGEoZyx0aGlzLkYpLGcuSigpLGcuZigpKX19dGhpcy5QKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxXbDpmdW5jdGlvbigpe3ZhciBhPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQ2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLk1tfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOnRoaXMuWCgpKTp0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuVmQoYSl9LmJpbmQodGhpcykpfSxWZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5WJiZ0aGlzLlYoKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGcpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnZrfHx4YTsoZnVuY3Rpb24oYyl7Yy51az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuTWM9dGhpcy5CYT10aGlzLmpkPSExO3RoaXMuVGg9ZS5PYigxMCk7dGhpcy5SZj0hMDt0aGlzLnpjPXRoaXMudGg9ITE7dGhpcy5jbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSWgoKSx0aGlzLmZsKCksdGhpcy52YigpKX0sY246ZnVuY3Rpb24oYSl7cmV0dXJuIGUuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxycTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuamEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlcsIjsiLHR5cGVvZiBhLlcsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVz9hLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlc/dHlwZW9mIGEuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5HYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5HYT9hLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkdhP3R5cGVvZiBhLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5HYT9hLkcuR2EoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLkdhP3R5cGVvZiBhLkcuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5sZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmxlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEubWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5tZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS52ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS52ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcudmU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy52ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApLYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLkpjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sZ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5NYyl7dmFyIGE9dGhpcy5KYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLk1jPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5NYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLk1jfSxBbTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoKXt2YXIgYT10aGlzLkpjKCksYj10aGlzLnltKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuc2g9ITApfXJldHVybiB0aGlzLnNofSx5bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuamQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmpkPSEwKTtyZXR1cm4gdGhpcy5qZH0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuSG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sSG46ZnVuY3Rpb24oKXt0aGlzLnpjPSEwO3ZhciBhPXRoaXMuZ2goKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5IKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5BYz0hMDtlLkgoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuQWM9ITA7aWYoZS5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuQWM9ITA7ZS5IKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5BYz0hMDtlLkgoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkFjPSEwO2UuSCgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuS2cmJmEuYWRzJiYodGhpcy5LZz1hLmFkcyk7cmV0dXJuIHRoaXMuS2d9LGZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5tYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5KaCgpfS5iaW5kKHRoaXMpKX0sdGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuSWEmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmdoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRkKCl9LmJpbmQodGhpcyksNTApKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQW0oKSl7dmFyIGI9dGhpcy5KYygpLGc9dGhpcy5LYygpO2ImJmcmJih0aGlzLnpjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudGg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkpjKCksYT10aGlzLktjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnRoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmCmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGdsOmZ1bmN0aW9uKCl7dGhpcy5GY3x8KHRoaXMuRmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkZjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuRmM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuRmMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5GYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2woKX0uYmluZCh0aGlzKSwxMCl9LAp0YjpmdW5jdGlvbigpe3JldHVybiBlLkRlPyExOnRoaXMudmF9LERhOmZ1bmN0aW9uKCl7aWYodGhpcy5xbSgpKXt0aGlzLnZhPSEwO2lmKGUuSCgiZ2lnYS5kZSIpfHxlLkgoInNwaWVsZXRpcHBzLmRlIil8fGUuSCgia2luby5kZSIpfHxlLkgoImRlc2lyZWQuZGUiKSl0aGlzLlJmPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scW06ZnVuY3Rpb24oKXtpZigwPD1lLlVhKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZS5IKCJnaWdhLmRlIil8fGUuSCgic3BpZWxldGlwcHMuZGUiKXx8ZS5IKCJraW5vLmRlIil8fGUuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkVkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuU2woKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLkRlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpPyh0aGlzLncoKSx0aGlzLmlhKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlJmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlJmLGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxvbDpmdW5jdGlvbigpe3RoaXMuaHF8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2woKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy51a3x8eWE7KGZ1bmN0aW9uKGMpe2Mud2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2ddKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLk1lKGIpKXthPWI7Zm9yKHZhciBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGI9bmV3IHhhKGFbZ10pLGIuZ2F8fHRoaXMuTShiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5UYyl9fSl9KShjKTsKdmFyIHphPWMud2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLk5qfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5mPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5YKCk7cmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8CihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLlgoKX0sc246ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JYixnPXRoaXMuamEoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIubWMmJigwPD1nLmluZGV4T2YoZCl8fGIuSGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLm5mPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sdWE6ZnVuY3Rpb24oKXt0aGlzLm5mKys7aWYoMTA8dGhpcy5uZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LExhOmZ1bmN0aW9uKCl7fSxWZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7CnZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5JZSlpZih0aGlzLktifHwodGhpcy5LYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLktiKyssMTU8dGhpcy5LYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLkllPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy50YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLkspLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx0YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZz0hMDtnfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBnfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLkJhKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5KbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkpsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Euc24oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiYKd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBSKGFbYl0pO2cuZ2F8fHRoaXMuTShnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy5Cbnx8RmE7bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLmRoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudW49YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLnVuKXtjYXNlICJiZWZvcmUiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZywKYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVShnKTt0aGlzLndkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy53ZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMud2QpfSxrYTpmdW5jdGlvbigpe3JldHVybiEwfSxubDpmdW5jdGlvbigpe2UueWgodGhpcy53ZCk7ZS5WZSh0aGlzLndkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sYWY6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBHYT1jLnlqfHxHYTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLApiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIEhhPWMueGp8fEhhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLmRoKGEsImVsZW1lbnRJRCIpO2lmKGUueWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5NKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuVmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuVmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhLEphPW5ldyBJYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBLYT0KYy5Eanx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnNqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sT2s6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy5zanx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCxmLGMpe3RoaXMuRWE9Yjt0aGlzLllnPXRoaXMuRWk9ITE7dGhpcy5LaD1kO3RoaXMuaWk9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuRWE9bmV3IEMoYikpO3ZhciBoPQp0aGlzLmpiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbSYmbS5ZZSh0aGlzLkVhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2YmJjQhPWgucmVhZHlTdGF0ZSYmZihoKX0uYmluZCh0aGlzKX1jLnRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBiKXt2YXIgYT1iLGI9IiIsZDtmb3IoZCBpbiBhKWIrPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLllnJiYoYis9CiImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5qYi51cmxDYWxsZWQ9dGhpcy5FYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5qYi5vcGVuKHRoaXMuRWEubWV0aG9kLHRoaXMuRWEudXJsLCExKTp0aGlzLmpiLm9wZW4odGhpcy5FYS5tZXRob2QsdGhpcy5FYS51cmwsITApLHRoaXMuRWl8fCh0aGlzLmpiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5qYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5qYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5qYi5zZW5kKGIpfWNhdGNoKGYpe2I9dGhpcy5FYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8dGhpcy5FYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpLG0mJm0uWWUodGhpcy5FYS51cmwpJiYKIWI/ZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOm0uWWUodGhpcy5FYS51cmwpLHRoaXMuS2gmJnRoaXMuS2goKX1yZXR1cm4gdGhpcy5qYn19fSkoYyk7dmFyIExhPWMudGp8fExhOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5GYT10aGlzLmllPSExfWMuYWo9YTthLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxhbzpmdW5jdGlvbihiKXt0aGlzLkZhPWJ9LE1uOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3hwOiJBZENsaWNrVGhydSIsenA6IkFkRXJyb3IiLEFwOiJBZFN0b3BwZWQiLERwOiJBZExpbmVhckNoYW5nZSIsRXA6IkFkVGFnUGFyc2VkIixIcDoiQWRWaWRlb0NvbXBsZXRlIixLcDoiQWRMb2FkZWQiLExwOiJBZFNraXBwZWQiLE1wOiJBZFN0YXJ0ZWQiLEJwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsQ3A6IkFkSW1wcmVzc2lvbiIsCnlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLmllLGFbZF0pfSxMbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuRmEmJnRoaXMuRmEuaGUpZm9yKHZhciBhIGluIHRoaXMuRmEuaGUpdGhpcy5GYS5oZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkZhLHRoaXMuRmEuaGVbYV0pO3RoaXMuRmEmJnRoaXMuRmEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuRmEuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmllJiYKdGhpcy5NbigpO3RoaXMuRmEmJnRoaXMuTG4oKX19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5JYT0hMTt0aGlzLmJjPSIiO3RoaXMua2Q9dGhpcy5hYz10aGlzLmxiPW51bGw7dGhpcy5RZz10aGlzLndiPXRoaXMuJGU9ITE7dGhpcy5BYT0iIjt0aGlzLlplPSExO3RoaXMucWE9dGhpcy5MYz0iIjt0aGlzLlVlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnRmPSExO3RoaXMuaGE9W107dGhpcy5RZT10aGlzLlJiPSIiO3RoaXMuZmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5lZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMueWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuWWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuU2I9IiI7dGhpcy5UYj1bXTt0aGlzLlViPVtdO3RoaXMuWGM9W107CnRoaXMucWM9IiI7dGhpcy5EYj0hMTt0aGlzLlVkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubGM9ITE7dGhpcy5GZz10aGlzLiRkPW51bGw7dGhpcy5HZj10aGlzLmhiPXRoaXMuUGc9dGhpcy5ZZD10aGlzLlNmPXRoaXMubWQ9dGhpcy51Yz0hMTt0aGlzLiRhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkJkPTA7dGhpcy5vaD0hMTt0aGlzLm5oPTFFMzt0aGlzLkJjPSExO3RoaXMuUGE9MUUzO3RoaXMuZGQ9dGhpcy5lZD0iIn1jLnVqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLklhLGFkdGFncGFyYW1ldGVyOnRoaXMuYmMsYWR0YWdtb2RpZmllcjp0aGlzLmxiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5hYyxhZHRhZ3JlZ2V4OnRoaXMua2QsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuJGUsc2lkZWxvYWRzOnRoaXMud2IsZGlzYWJsZXRlc3RzOnRoaXMuUWcsaG9tYWRBbGlhczp0aGlzLkFhLAppc0luaXRpYWxpemVkOnRoaXMuWmUsZ2xvYmFsQ29uZmlnOnRoaXMuTGMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLlVlLHNlcnZlcjp0aGlzLmhhLHN2bUNvbmZpZzp0aGlzLlJiLGhvbWFkQWRwYXRoOnRoaXMuUWUsSE9NQURfVkVSSUZJRUQ6dGhpcy5mZSxIT01BRF9CTE9DS0VEOnRoaXMuZWUsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMuWWIsdGVzdEhpZGU6dGhpcy5TYix0ZXN0VGFnczp0aGlzLlRiLHRlc3RUYWdzSlM6dGhpcy5VYix0ZXN0VGFnc1hIUjp0aGlzLlhjLHRlc3QzUENvb2tpZTp0aGlzLnFjLHRocm90dGxlOnRoaXMuVWQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5sYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkZnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMudWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1kLAp1c2VTdHJpY3RDaGVja3M6dGhpcy5TZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5ZZCxjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy55YSxzZXJ2ZXJJZDp0aGlzLnhmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5hYix2cGFpZDp0aGlzLmhiLHNraXBBbGxvd2VkOnRoaXMuR2Ysdm1hcHM6dGhpcy5YZixhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuQmMsYWRGYWxsYmFja1VSTDp0aGlzLmVkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5kZH19LFVuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLklhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLmJjPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMubGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYKKHRoaXMuYWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5rZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLiRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy53Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlFnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5aZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5MYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlVlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaGE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5SYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuUWU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuZmU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5lZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYKKHRoaXMueWI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5ZYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuU2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuVGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5VYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlhjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5xYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuVWQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmxjPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLkZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnVjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMubWQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuU2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5ZZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuJGE9Yi5jb25maWdGYWlsdXJlcyk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy54Zj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmFiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuaGI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuR2Y9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuWGY9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5CYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuZWQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5kZD1iLmFkRmFsbGJhY2tDb25maWcpfSxubTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2FdJiYxPT10aGlzLiRhW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LHpmOmZ1bmN0aW9uKGIpe3RoaXMuJGFbYl09ITB9LFhsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYV0mJjE9PXRoaXMuJGFbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sU2Q6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKYj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk9iKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWUuWmsoYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZj0iIixjPSIiLGU9IiIsaD0iIjtpZighdGhpcy5JYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2Y9dGhpcy5YZShiKTtjPXRoaXMuYWEoYik7Zj8odGhpcy5OYygpP2U9YjplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5TYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLmJjfHx0aGlzLmxifHx0aGlzLmFjfHx0aGlzLmtkKSYmKGg9dGhpcy5hbihoKSk7Yj1uZXcgQyhlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKToKdGhpcy5abChjLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5DYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LFhlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5OYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaGEmJnRoaXMuaGEubGVuZ3RoJiYwPHRoaXMuaGEubGVuZ3RoJiYoYT10aGlzLmhhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsCiIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxZZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLlhlKGIpO3JldHVybiBhfSxabDpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LENkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFbdGhpcy54Zl19LFNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DZCgpLGE9dGhpcy5FZigobmV3IERhdGUpLmdldFRpbWUoKSsKIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sR2g6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sJG06ZnVuY3Rpb24oYixhKXt2YXIgZD1lLmFhKGIpLGY9IiIsZj0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxCPTA7QjxoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy5HaChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pOwpoPVtdO2ZvcihsIGluIGYpaC5wdXNoKGwrIj0iK2ZbbF0pO2Y9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZj10aGlzLkdoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYW46ZnVuY3Rpb24oYil7dGhpcy5iYyYmKGIrPXRoaXMuYmMpO2lmKHRoaXMubGIpZm9yKHZhciBhIGluIHRoaXMubGIpdGhpcy5sYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5sYlthXSkpO3RoaXMuYWMmJihiPXRoaXMuJG0oYix0aGlzLmFjKSk7cmV0dXJuIGJ9LG1sOmZ1bmN0aW9uKCl7dGhpcy55YSYmdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLmhsKHRoaXMueWEuY2xpZW50QVBJcyl9LGhsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmCmEuYm8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmFvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZixjLGUpe209dGhpczt0aGlzLlplPSEwO3RoaXMuTGM9Yjt0aGlzLnFhPWE7dGhpcy50Zj1kO3RoaXMuJGQ9Zjt0aGlzLmdjPWM7dGhpcy55YT1lfHx7fTt0aGlzLm1sKCk7dGhpcy5RbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLk9tKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkRjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuRGMoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sdWI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxRbTpmdW5jdGlvbigpe3RoaXMuSmEobmV3IEModGhpcy5MYyt0aGlzLnRlKCJnbG9iYWwiKSksdGhpcy5sbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy56ZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkRjKCl9LmJpbmQodGhpcyksITApfSxPbTpmdW5jdGlvbigpe3RoaXMuSmEobmV3IEModGhpcy5xYSt0aGlzLnRlKCJjbGllbnQiLC0xIT10aGlzLnFhLmluZGV4T2YoIj8iKSkpLHRoaXMuRGMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuemYoImNsaWVudCIpO3RoaXMuc2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LHRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ7ZD0oYT8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5PYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYKKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5tZCl7dGhpcy5tZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZyl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTsKZm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5nYz0hMSk7ImZvY3VzLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuZ2M9ITEpO3RoaXMuZ2MmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5nYz90aGlzLmdjKCk6KGEoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYSw1MDApKTt0aGlzLlM9dGhpcy5VZT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy5lZSkpO3RoaXMuV2IoKTtlLkhjKGsucW4pOyhhPWUuVWEodGhpcy5DZCgpKSl8fChhPWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpOwpifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxsbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZj0hMTt0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGY9ITApfWNhdGNoKGgpe31pZighKGZ8fGEuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUmJ8fAp0aGlzLkFhfHx0aGlzLkRjKCk6KHRoaXMuSWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy5XYigpKX19LERjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7dHJ5e3ZhciBjPWUuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihhPSEwKX1jYXRjaChoKXt9Yz1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8ZC5zZXJ2ZXIubGVuZ3RoO2IrKyl7dmFyIGE9ZC5zZXJ2ZXJbYl07dHJ5e3ZhciBnOyhnPXZvaWQgMD09PWEpfHwoZz0hYS5yZXBsYWNlKCJbaGFzaF0iLHRoaXMuRWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSkpO2lmKGcpcmV0dXJuITF9Y2F0Y2goZil7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmhhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5oYS5sZW5ndGg7YisrKXRoaXMuaGFbYl09dGhpcy5oYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuSCgid2ViLmRlIil8fGUuSCgiZ214Lm5ldCIpfHxlLkgoImdteC5hdCIpfHwKZS5IKCJnbXguY2giKXx8ZS5IKCIxdW5kMS5kZSIpKSYmIXRoaXMuTmMoKSlmb3IoYj0wO2I8dGhpcy5oYS5sZW5ndGg7YisrKXRoaXMuaGFbYl09dGhpcy5oYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5kZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5SYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuUWU9ZC5hZHBhdGh8fCIiO3RoaXMueGY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuaGEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5SYiYmdGhpcy5BYSYmdGhpcy5oYS5sZW5ndGg/dGhpcy5PYyghMSk6KHRoaXMuSWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy5XYigpKX0sY2k6ZnVuY3Rpb24oYil7dGhpcy5lZHx8KHRoaXMuZWQ9Ynx8CiIiKX0sT2M6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEModGhpcy5TYygpKSxkPXRoaXMuYWEodGhpcy5SYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQyh0aGlzLlJiK3RoaXMudGUoImN1c3RvbWVyIikpO3RoaXMuSmEoYSx0aGlzLndvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnpmKCJjdXN0b21lciIpO2I/dGhpcy5paz90aGlzLnNhKCJub1NWTUNvbmZpZyIpOih0aGlzLmlrPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5PYyghMCl9LmJpbmQodGhpcyksITApfX0sd286ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9CmIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5sYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubGM9ITA7dGhpcy5PYyghMCk7cmV0dXJufX1hPSExO3RyeXt2YXIgYz1lLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWlmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiYoZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGhpZGUiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFncyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzanMiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc3hociIpKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLlNmPXRoaXMuZ2IoZC5zdHJpY3QpO3RoaXMuWWQ9dGhpcy5nYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7CnRoaXMuUGc9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmFiPXRoaXMuZ2IoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmdiKGQuZW5hYmxlZCk7dGhpcy5TYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlViPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWGM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnFjPWQudGVzdDNwY29va2llfHwiIjt0aGlzLmJjPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMubGI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuYWM9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmtkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLiRlPWQuanNwb3B1cHN8fCExO3RoaXMud2I9ZC5zaWRlbG9hZHN8fCExO3RoaXMuaGI9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLmhiO3RoaXMuR2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5uZD1kLmNhcHRpb25fZHVyYXRpb258fAohMTt0aGlzLlhmPWQudm1hcHN8fCIiO3RoaXMuQmM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmRkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlVkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMubGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmxjPSEwLHRoaXMuT2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuSm8oKSYmKHRoaXMuU2J8fHRoaXMuVWJ8fHRoaXMuVGJ8fHRoaXMuWGMpP3RoaXMudGY/KHRoaXMuSWE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy55ZSgpLHRoaXMuV2IoKSk6dGhpcy56bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLk9mKCkpfX0sem86ZnVuY3Rpb24oKXt0aGlzLnlvKCk7dGhpcy5BbygpfSxBbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5ZKDEwKSxoPWUuWSgxMCksQj1lLlkoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQ2IoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS52ZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLkNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLnNhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxPZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuV2IoKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy51Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5JYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIoYikpLHRoaXMuV2IoKSx0aGlzLnllKCkpfSx5bzpmdW5jdGlvbigpe2lmKHRoaXMuU2Ipe3ZhciBiPWUudmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLkZtKCkpdGhpcy5UZCh0aGlzLlliLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuU2IpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5TYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlRkKHRoaXMuWWIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmxpKCl9fWVsc2UgdGhpcy5saSgpfSxNZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuT2IoKSksCnRoaXMuRG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLkxmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLkxmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlRkKHRoaXMuWWIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5UYj10aGlzLlhjKSYmdGhpcy5UYi5sZW5ndGgpe3ZhciBkPXRoaXMuVGIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5MZigpfSxEbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5KYShuZXcgQyhiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5PYigpKSx0aGlzLkVvKGYsMDxkLmxlbmd0aD9iLmJpbmQodGhpcyk6dGhpcy5NZi5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSl9Y2F0Y2goYyl7dGhpcy5NZigpfX1mdW5jdGlvbiBhKCl7dGhpcy5UZCh0aGlzLlliLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlViJiZ0aGlzLlViLmxlbmd0aCl7dmFyIGQ9dGhpcy5VYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLk1mKCl9LEVvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLnFjKXRyeXtlLkVkKHRoaXMucWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuRGI9IXRoaXMuZ2IoYS5jYyk7dGhpcy5PZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5qaSgpfWVsc2UgdGhpcy5PZigpfSxqaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuV2IoKTt0aGlzLnllKCl9LEZtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LApXYjpmdW5jdGlvbigpe3ZhciBhPSIwIixnPSIwIjt0cnl7ZS5DYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnVjJiYoZz0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitnLCEwKTt0aGlzLnFjJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuRGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLmZlKSk7dGhpcy4kZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLiRkJiZ0aGlzLiRkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkRifSl9LGxsOmZ1bmN0aW9uKCl7aWYodGhpcy5ZZCYmdGhpcy5ubSgpKXt2YXIgYT10aGlzLlhsKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZyl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPQphLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxKYTpmdW5jdGlvbihhLGcsZCxmLGMsaCl7dGhpcy5CZHx8KHRoaXMuQmQ9MCk7dGhpcy5CZCsrO3RoaXMuQmQ+dGhpcy5uaCYmIXRoaXMub2gmJih0aGlzLm9oPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5uaCwhMCkpO2E9bmV3IExhKGEsZyxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtmJiYoYS5FaT0hMCk7YyYmZS5EbSgpJiYoYS5ZZz0hMCk7aCYmKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0saWw6ZnVuY3Rpb24oKXt0aGlzLlltfHwodGhpcy5ZbT0hMCxlLkNhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LApmdW5jdGlvbihhKXt2YXIgZz1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihmPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGZbMF0mJihmPWZbMF0pLGYpe2Y9ZiYmZi5jaGlsZE5vZGVzJiZmLmNoaWxkTm9kZXNbMF0/Zi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLk5jKCl8fChmPXRoaXMuYWEoZiksZj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGQpe31lLm5ldHdvcmtTdGF0ZT09CmUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9ZS5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGcpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpO2UubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LAp4bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5YZn0samw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkphKGEsdGhpcy5Wby5iaW5kKHRoaXMpLHRoaXMuVW8uYmluZCh0aGlzKSl9LFZvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8CnRoaXMuSGwoKX0sVW86ZnVuY3Rpb24oKXt9LEhsOmZ1bmN0aW9uKCl7ZS5IYyhrLkdsKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx5ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMud2IubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy53YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5iYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZmEoKV09dGhpcztlLmJiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEpvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuVWR9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLAphfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxZOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBnPSIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxnYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxDYjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sYWE6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbZ1tmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sRWY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsZT1BcnJheSg4MCksaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZik7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1oO249aztxPWw7cj1tO3U9dDtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZxfH5uJnIpK3UrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7Zm9yKGY9MjA7Mzk+PWY7ZisrKXY9ZChjLDUpKyhuXnFecikrdStlW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1xLHE9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTQwOzU5Pj1mO2YrKyl2PWQoYyw1KSsobiZxfG4mcnxxJnIpK3UrZVtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZj02MDs3OT49ZjtmKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihnKGgpK2coaykrZyhsKStnKG0pK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLnVqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5MaXx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5lYj1hLmMuUigpOnRoaXMuZWI9IiI7YS5jLnZoJiZhLmMudmgoe3BhdXNlOnRoaXMuSGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy4kaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5oZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLlBvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEub2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5oYz10aGlzLmxkPSExO3RoaXMuWGs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9Zzt0aGlzLmliPXt9O3RoaXMudmlkZW89e307dGhpcy5RZD17fTtlLnJiKCJuZXdCaWdBZElkIik7dGhpcy4kaz1lLlkoMTApOwp0aGlzLklmPTA7dGhpcy5oZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmhkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmhkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlVrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUmM9dGhpcy5QZD0hMTt0aGlzLkVoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5zZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMubWM9ITE7dGhpcy53bD1lLlkoMTApO3RoaXMuTmI9ZS5ZKDEwKTt0aGlzLkxiPWUuWSgxMCk7dGhpcy5laT1lLlkoMTApO3RoaXMuY29uZj17fTt0aGlzLmFlPQp0aGlzLlhiPXRoaXMuQ2U9dGhpcy5zZD10aGlzLlJkPXRoaXMueGI9dGhpcy5zYz10aGlzLk5oPXRoaXMuQmU9dGhpcy54ZD10aGlzLktvPXRoaXMuQWI9dGhpcy5NYj0hMTt0aGlzLnhjPVtdO3RoaXMubmM9e307dGhpcy5tbj0yMDA7dGhpcy4kZj10aGlzLlljPXRoaXMuQ2M9dGhpcy5aZj10aGlzLnNmPSExO3RoaXMua2Y9e319Yy5vaj1hO2EucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBnfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMucG8oKTtlLm8oay5Mayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxjZjpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLkFiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLklmKyssZS5yYigibmV3U21hbGxBZElkIiksdGhpcy5BLmxsKCksYz1tLmdldENvbmZpZygpLGUuRGUmJih0aGlzLkEuVW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5JYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5yaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkVoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLnJpKCksCm5ldyBTKHRoaXMsYSx0aGlzLkVoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmhiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB2Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2Yy5jZihhLGcsZCl9LDUwKX19LG9mOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5hZT10aGlzLlhiPXRoaXMuQmU9dGhpcy54ZD0hMTt0aGlzLmI9YTt0aGlzLmpvKHRoaXMuYik7dGhpcy5qaChhKTt0aGlzLnhjPXRoaXMuJGcoYSk7dGhpcy5wbCgpfSxqaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5RZD10aGlzLmhtKGIpKSx0aGlzLmpoKGIucGFyZW50KSl9LCRnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy4kZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLlJsKGIpKSk7cmV0dXJuIGd9LFJsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5MJiZhLkwuZ2V0QXR0cmlidXRlKXtnPWEuTC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxobTpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuTCl7Zz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuTC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEucGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scmE6ZnVuY3Rpb24oYSl7YS5aYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS51ZCYmYS51ZC5lcnJvciYmYS51ZC5lcnJvci5jb2RlJiYoZz1hLnVkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuJGMuY29kZTpnPT1GLmplLmNvZGU/ZS5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZS5kZigpLGc9PUYuZGcuY29kZSYmZS5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7ZS5vKGsuRmwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnFvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuRGImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5EYiwhMCk7YnJlYWs7Y2FzZSB2LmJnLmNvZGU6ZS5vKGsuV28sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmUubyhrLnFwLAp0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5rZS5jb2RlOmUubyhrLnJwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuZ2UuY29kZTplLm8oay5lbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuY2UuY29kZTplLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuYWcuY29kZTplLm8oay5Ubyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLldhKCJ1bmtub3duIil9dGhpcy5pYyhhKTt0aGlzLlFhKCl9LGljOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTmEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5OYS5wb3AoKTt0aGlzLmJmKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxqbzpmdW5jdGlvbihhKXt0aGlzLkNlPSExO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5EZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmliLnpJbmRleD1nO2c9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC56ZCYmKGM9ZC56ZCgpKTtjLnZpZGVvU2xvdCYmKGc9Yy52aWRlb1Nsb3QsdGhpcy5zZj0KITApfWNhdGNoKGgpe31nLnNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5VayYmdGhpcy5wbGF5ZXIuSmUoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkplKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk8ubGVuZ3RoO2QrKylnLmNhblBsYXlUeXBlKGEuT1tkXS50eXBlKSYmCnRoaXMuUGsoZyxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLnNmJiZnLmxvYWQoKTtpZih0aGlzLm1pKGcpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlNrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5zZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuc2woKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXToKYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZyksdGhpcy5obygpKTp0aGlzLmIub3JpZ2luLlJnKHYuZ2UpfSxobzpmdW5jdGlvbigpe3RoaXMuWmY9ITA7dGhpcy54Yj10aGlzLnNjPSExO3RoaXMuYS5jLmthJiZ0aGlzLmEuYy5rYSgpJiYoZS5vKGsuSWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLnhiPSEwKTtlLnplKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm9hJiZlLlRrKHRoaXMuYi5vcmlnaW4ub2EpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5CO3RoaXMuYS5CPUQucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQixhKTt0aGlzLmEuT2goKTt0aGlzLmEuRmYoKTtmb3IoYT10aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYS5GZigpO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5EZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLnhiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuUWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLkRmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5rbSgpLGM9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmYi51cmwmJjA8PWIudXJsLmluZGV4T2YoIndlbGVjdC5qcyIpJiZ0aGlzLkEpe3ZhciBoPXRoaXMuQS5nZXRDb25maWcoKTtoJiZoLmFkRmFsbGJhY2tDb25maWcmJmguYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyYmKGM9SlNPTi5zdHJpbmdpZnkoaC5hZEZhbGxiYWNrQ29uZmlnKSl9dmFyIGs9Cntob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuRCwiY29uZmlnIixrKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsCmspfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUueGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIiwKdGhpcy5BKTt0aGlzLkQuc3JjPWE7ZS51ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlJkJiZ0aGlzLmEuYy51YSgpJiZlLm8oay5FYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5rYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy54Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZXAoKSx0aGlzLmEua2MoITApLCF0aGlzLlhiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSwKdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5YYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5hZT0hMDtlLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5XZSh0aGlzLlhiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEua2MoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmtjKCEwKSx0aGlzLm1wKCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtwKCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmxwKCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubnAoKTsiQWRWaWRlb0NvbXBsZXRlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLm5iKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UubyhrLkhnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5CY3x8dGhpcy5ZYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChkKXt3aW5kb3cub3BlbihoLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ocCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT0KYS5kYXRhLm5hbWUmJmUubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlljJiYodGhpcy4kZj0hMSx0aGlzLnBjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy54Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUWIoIm11dGVkIiwidXNlciIpLGUubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLnhiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5RYigidW5tdXRlZCIsCiJ1c2VyIiksZS5vKGsuUWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZS5vKGsucWUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtlLnVlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcykpO2UudWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEudWcoZnVuY3Rpb24oYSl7ZS5sYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMudHJhY2soInBhdXNlIik7ZS5vKGsub2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuc2M9ITB9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7CmEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5zYz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLmdpKCk7ZS5vKGsubGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sbXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWGEoInN0YXJ0Iik7ZS5vKGsuZmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sCmtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMueGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2UubyhrLm5nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtlLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMuVWYoKTt0aGlzLlhhKCJjb21wbGV0ZSIpfSxDaTpmdW5jdGlvbihhKXtpZih0aGlzLkQmJnRoaXMuRC5wYXJlbnROb2RlJiZ0aGlzLkQucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLldhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgZz0KdGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtnLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZyk7ZS56ZSgpO3RoaXMuRD0hMTt0aGlzLlFhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGc9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZyYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZz1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZy5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2UubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LFBrOmZ1bmN0aW9uKGEsZyl7ZnVuY3Rpb24gZChhLGIpe2lmKGIuSWEmJmIuaXNFbmFibGVkJiYhYi5OYygpKXt2YXIgZD1iLmFhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKYy5zcmM9ZChnLHRoaXMuQSk7Yy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChnLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sU2s6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5XZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5VZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlZmLmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5XZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5VZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlZmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGN8fHRoaXMuV2YoYSl9LmJpbmQodGhpcyksdGhpcy5YaykpfSxXZjpmdW5jdGlvbihhKXtpZighdGhpcy5sZCYmdGhpcy5taSh0aGlzLnZpZGVvKSYmIXRoaXMuTWImJiF0aGlzLmhjKXt0aGlzLmxkPSEwO3RyeXtpZighZS5DYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5iLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuTWJ8fCh0aGlzLk1iPSEwLHRoaXMuTGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5QZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUWEoKTtyZXR1cm59fWNhdGNoKGcpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5GZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy55ZygpO3RoaXMuYS5PaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5KZigpfX0sSmY6ZnVuY3Rpb24oKXt0aGlzLnNkfHx0aGlzLmpnKCl9LGpnOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMudmlkZW8ucGxheSgpO2lmKGcmJmdbImNhdGNoIl0pZ1siY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuc2R8fChhP3RoaXMuUWEoKToodGhpcy5oZighMCksdGhpcy5qZyghMCkpKX0uYmluZCh0aGlzKSk7CmNhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5vYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm9jLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm9jLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy5zZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuSmYoKSl9LmJpbmQodGhpcyk7dGhpcy5MZSgpLmRpKHRoaXMpfSxVZjpmdW5jdGlvbigpe3RoaXMuQS5hYiYmIXRoaXMuTWImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTt0aGlzLkJlPSEwO2UubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5RYSgpfSxNazpmdW5jdGlvbihhKXtmb3IodmFyIGc9W10sZD0hMSxjPTA7YzxhLmxlbmd0aDtjKyspZD1lLmVoKGFbY10pLApnLnB1c2goZCk7YT17aGFzaGVzOmd9O2E9ay5TYShhLHRoaXMudSgpKTtlLm5vKGEpfSxRYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5iZSYmdGhpcy5Nayh0aGlzLmIuYmUpO2lmKCF0aGlzLkNlKWlmKHRoaXMuQ2U9ITAsdGhpcy5hZXx8KGUubyhrLmhuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnpifHx0aGlzLmIudmMpe2UucmIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuSWYrKzt0aGlzLmhjPXRoaXMubGQ9ITE7dHJ5e3RoaXMuTGQodGhpcy52aWRlbyl9Y2F0Y2goZyl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5pYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChjKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLlBkPSExO3RyeXt0aGlzLmEudmkoKX1jYXRjaChoKXt9dGhpcy5SZD0hMDt0aGlzLmEuUGUoKTsKdGhpcy5tYz0hMTt0aGlzLkxlKCkuWWgoKTt0aGlzLmIuemImJnRoaXMuYi5vcmlnaW4uamYoKTt0aGlzLmIudmMmJihhP3RoaXMuYi5vcmlnaW4uSGgoKTp0aGlzLnJkKCkpfWVsc2UgdGhpcy5yZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkxkKHRoaXMudmlkZW8pLHRoaXMuVmYoYSkpfSxWZjpmdW5jdGlvbihhKXt0aGlzLmhjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5pbCgpO3RoaXMuYi5vcmlnaW4uUmcodi5nZSl9LEFpOmZ1bmN0aW9uKCl7aWYodGhpcy5Lbyl0aGlzLlFhKCk7ZWxzZXt0aGlzLm1jPQohMDt0aGlzLmEuYy51YSYmIXRoaXMuUmQmJnRoaXMuYS5jLnVhKCkmJmUubyhrLkVjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk5vKGEpO2lmKCF0aGlzLlhiKXt2YXIgZz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuWGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmFlPSEwO2UubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6ZyxwZXJjZW50OmQsCnN0YXJ0VGltZTohMX07ZS5XZSh0aGlzLlhiKX1kPSIiO3RoaXMuYi5IZiYmKGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuSGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuUGR8fCh0aGlzLlBkPSEwLGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLnpiPyh0aGlzLmhjPXRoaXMubGQ9ITEsdGhpcy5MZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLlBkPSExLHRoaXMuYS52aSgpLHRoaXMuYi5vcmlnaW4uamYoKSk6CnRoaXMuUWEoKX0uYmluZCh0aGlzKSkpKSxnLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuaGQucmVwbGFjZSgiW3RpbWVdIixlLlpnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMuc2U9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5OaHx8KHRoaXMuTmg9ITAsdGhpcy54ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE5vOmZ1bmN0aW9uKGEpe2UubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5NYnx8KDA9PWEmJih0aGlzLkFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLkFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5EYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsCmZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5NYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmFiJiZ0aGlzLlhhKCJzdGFydCIpLGUubyhrLmxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZS5vKGsucWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYWImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy54ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmlnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PQpNYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5hYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUubyhrLm5nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYWImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGcpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxnLCEwKX0scG86ZnVuY3Rpb24oKXtlLldkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LApnaTpmdW5jdGlvbigpe2UuV2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scW86ZnVuY3Rpb24oKXtlLldkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7ZS5XZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5aZnx8dGhpcy5BLmFiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFFiOmZ1bmN0aW9uKGEsZyl7dGhpcy5BLmFiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsZywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZyl7aWYoIXRoaXMuTWIpe3RoaXMua2YmJnRoaXMua2YudHJhY2smJnRoaXMua2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLkRlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwKImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5pbSh0aGlzLmIuTmEsYSl9Y2F0Y2goYyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkNjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuUWQuaW1wcmVzc2lvbnMmJmUuQm0oaC51cmwsdGhpcy5RZC5pbXByZXNzaW9ucyk/dGhpcy5iZihoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuUWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5iZihoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZyl0cnl7dGhpcy5iLk5hPXRoaXMuemwodGhpcy5iLk5hLGEpfWNhdGNoKEIpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWUuQ2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYz0iIjt0aGlzLlpmJiYoYz0iX3ZwYWlkIik7dGhpcy5ZYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxiZjpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQS53YShhKSxkJiZjLk9rKGQpLGZ8fChmPXRoaXMuT2cpLGV8fChlPXRoaXMuT2cpLHRoaXMuUWsoYSksdGhpcy5BLkphKGMsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFFrOmZ1bmN0aW9uKGEpe3RoaXMubmNbYV09Im9wZW4ifSxYaDpmdW5jdGlvbihhKXt0aGlzLm5jW2FdPSJjbG9zZWQifSxwbDpmdW5jdGlvbigpe3RoaXMubmM9Cnt9fSxzbzpmdW5jdGlvbigpe3ZhciBhPTAsYztmb3IoYyBpbiB0aGlzLm5jKXRoaXMubmMuaGFzT3duUHJvcGVydHkoYykmJiJvcGVuIj09dGhpcy5uY1tjXSYmYSsrO3JldHVybiBhfSxpbTpmdW5jdGlvbihhLGMpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1jfSl9LHpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS50ZyYmYS50Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZS5DYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5wYygpO2Vsc2UgaWYodGhpcy5iLm5iKXt0cnl7dmFyIGE9KG5ldyBEYXRlKS5nZXRUaW1lKCk7CnRoaXMuYi5BZXx8KHRoaXMuYi5BZT0xKTtpZigxMDA+YS10aGlzLmIuQWUpcmV0dXJuO3RoaXMuYi5BZT1hfWNhdGNoKGMpe31lLm8oay5IZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuQmN8fHRoaXMuWWMpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIubmJ9Y2F0Y2goYyl7YT13aW5kb3cub3Blbih0aGlzLmIubmIsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5uYiwiX3RvcCIpfWNhdGNoKGcpe3dpbmRvdy5vcGVuKHRoaXMuYi5uYiwiX3RvcCIpfX19LmJpbmQodGhpcyksNTAwKX19LFhvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmhkLnJlcGxhY2UoIlt0aW1lXSIsZS5aZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5BLm5kJiYoYz10aGlzLkEubmQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmIuYmluZCh0aGlzKSwKMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sRmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5uZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sTmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5uZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFlLktmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy53bDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYygpO3RoaXMuTmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IiwKZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYygpO3RoaXMuTmQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOgooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkxiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkxvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucGMoKTt0aGlzLk5kKCl9LmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLmVpO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuSGYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuQ2EoKXx8Cih0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnBjKCk7dGhpcy5OZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLApkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS51ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLklnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5oZigpKTt0aGlzLkdiKCl9fSxHYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHBjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLiRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5mZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLm9lLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLnNjPyhlLmxhKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuc2M9ITEpOihlLmxhKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5zYz0hMCl9LEhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsub2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5mZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlFiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLlFmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUWIoIm11dGVkIiwidXNlciIpLGUubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxNbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpOwp0aGlzLnhiPyhlLmxhKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMueGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMueGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0saGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5RYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuRmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFBvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlFiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLlFmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxvYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLm9jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm9jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5vYyk7dGhpcy5zZHx8dGhpcy5zZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuSmYoKSl9LHJkOmZ1bmN0aW9uKCl7dGhpcy5LbSgpJiZ0aGlzLkptKCkmJih0aGlzLkEudWN8fCJzcGllZ2VsLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuSmImJnRoaXMuT28oKXx8KHRoaXMuc2Q9ITAsdGhpcy5BYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5BYj0hMSksdGhpcy5KZygpKX0sS206ZnVuY3Rpb24oKXt2YXIgYT1lLnZkKCk7aWYoIXRoaXMuQS5oYnx8ZS5DYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGM9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuQ2EoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsYytkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LEptOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuUmN8fChhPQohMCxjLmFkRmFsbGJhY2tVUkx8fChjLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkNjJiZjLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5SY3x8ZS50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuQ2M/ImFueSI6IiIpKyhjLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5SYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuQ2MmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlJjfSxZbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sT286ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgYz1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoYy5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmMuYXZhaWxhYmxlKXtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgZz1lLnhnKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoZylyZXR1cm4gdGhpcy5jZihnLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy5yZCgpfXZhciBjPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuWWwoKTt0aGlzLkNjPXRoaXMuUmM9dGhpcy5ZYz10aGlzLiRmPSEwO3JldHVybiBjPyhlLmJiKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2MsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LEpnOmZ1bmN0aW9uKGEpe3RoaXMuc28oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpnKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5tbik6KHRoaXMuUmQ9ITAsdGhpcy5hLlBlKCksdGhpcy5hLlJuKCksdGhpcy5tYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkJlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGUubyhrLnZsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5MZSgpLlloKCkpfSxMZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEoIm1pblZpcyIpO2EmJihlLlZlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuSGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5uYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi56Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy54YyYmMDx0aGlzLnhjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy54YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy4kaysiLSIrdGhpcy5JZjt0aGlzLmImJnRoaXMuYi5maCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZmgoKSk7cmV0dXJuIGF9LE9nOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5vanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5Hb3x8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubmE9bnVsbDt0aGlzLlc9W107dGhpcy5MPW51bGw7dGhpcy53Yz10aGlzLnljPSExO3RoaXMub2E9IiI7dGhpcy5ZZj0hMTt0aGlzLnFoPSIiO2QmJmQuZW1wdHk/dGhpcy5UbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLnNrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnZkKCksYjtiPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOm0ud2EobS5TZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihlLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuSCgiZmFuZG9tLmNvbSIpfHxlLkgoImdpZ2EuZGUiKXx8ZS5IKCJraW5vLmRlIil8fGUuSCgic3BpZWxldGlwcHMuZGUiKXx8ZS5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8ZygpKXt2YXIgaD1lLkxnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGc9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxsPWZ1bmN0aW9uKCl7cmV0dXJuKGUuSCgiZ2lnYS5kZSIpfHxlLkgoImtpbm8uZGUiKXx8ZS5IKCJzcGllbGV0aXBwcy5kZSIpfHxlLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZygpfHxrKCl8fGwoKXx8ImFwcHNwb3QiPT1jKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLlNkKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLlNkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZS50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bS53YShtLlNkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5KYShiLHRoaXMuU20uYmluZCh0aGlzKSx0aGlzLlBtLmJpbmQodGhpcykpfSxhaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5uYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkpiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5KYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuSmJ8fHRoaXMuSG0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0ueG8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSG06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxTbTpmdW5jdGlvbihhKXt0aGlzLnpuKGEpO3RyeXt0aGlzLm5hPWEucmVzcG9uc2VYTUwsdGhpcy5uYXx8KHRoaXMubmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2LmtlKSl9dGhpcy5XPXRoaXMuYWgoKTt0aGlzLnljPXRoaXMuTmYoKTt0aGlzLndjPXRoaXMua2koKTt0aGlzLnFoPWEudXJsQ2FsbGVkO2lmKHRoaXMuVy5sZW5ndGgpdGhpcy5RYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlJhKHYuJGMse2Vycm9yOnRoaXMuWWY/Ri5qZTpGLmNnfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuVWEodGhpcy5vYSksITApfWNhdGNoKGMpe319fSxUbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5uYXx8Cih0aGlzLm5hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2LmtlKSl9dGhpcy5XPXRoaXMuYWgoKTt0aGlzLnljPXRoaXMuTmYoKTt0aGlzLndjPXRoaXMua2koKTt0aGlzLlcubGVuZ3RoP3RoaXMuUWMoKTp0aGlzLnJhKHRoaXMuUmEodi4kYyx7ZXJyb3I6dGhpcy5ZZj9GLmplOkYuY2d9KSl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlJhKHYuYmcse2RlcHRoOmJ9KSl9LFFjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuVy5zaGlmdCgpO3RoaXMuTG0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMua2goKSxnLHtBZFN5c3RlbTp0aGlzLlFsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMub2YodGhpcy55bCgpKSl9LGpmOmZ1bmN0aW9uKCl7dGhpcy55Yz8odGhpcy55Yz0xPHRoaXMuVy5sZW5ndGgsCnRoaXMuVy5sZW5ndGgmJnRoaXMuUWMoKSk6dGhpcy5wYXJlbnQuamYoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLlFjKCkpOnRoaXMucGFyZW50LkhoKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLkljKCk/dGhpcy5yYSh0aGlzLlJhKHYuY2UpKTp0aGlzLnJhKHRoaXMuUmEodi5hZykpLCExKToodGhpcy5yYSh0aGlzLlJhKHYuJGMsRi5kZykpLCExKX0sb2Y6ZnVuY3Rpb24oYSl7dGhpcy5vYXx8KHRoaXMub2E9IiIpO2EuYmV8fChhLmJlPVtdKTthLmJlLnB1c2godGhpcy5xaCk7YS5OYT1hLk5hLmNvbmNhdCh0aGlzLmVmKCkpO2EuemI9YS56Yj9hLnpiOnRoaXMueWM7YS52Yz1hLnZjP2EudmM6dGhpcy53YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5vYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuWGc7dGhpcy5wYXJlbnQub2YoYSl9LAp5bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5kdXJhdGlvbj10aGlzLkljKCk7YS5PPXRoaXMuaGgoKTthLm5iPXRoaXMuVGwoKTthLnpxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUGwoKTthLkhmPXRoaXMuZ20oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlhnO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlhnO2lmKCF0aGlzLkwmJnRoaXMubmEmJnRoaXMubmEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLkw9dGhpcy5uYTt0cnl7aWYodGhpcy5MJiZ0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5OYT1hLmVycm9yLmNvZGUhPXYuY2UuY29kZT9hLk5hLmNvbmNhdCh0aGlzLlVsKCkpOmEuTmEuY29uY2F0KHRoaXMuY20oKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5pYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmljJiZ0aGlzLnBhcmVudC5pYyhhKSxiPTAsdGhpcy5RYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGljOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmljKGEpfSxSZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaGgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5JYygpfSxOZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5OZigpJiYoYT0hMCk7cmV0dXJuIGF9LHpuOmZ1bmN0aW9uKGEpe3RoaXMub2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5vYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm9hPSJVTktOT1dOIn10cnl7dGhpcy5ZZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMbTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmtoKCkubGVuZ3RofSxraDpmdW5jdGlvbigpe3JldHVybiB0aGlzLktlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFFsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2UodGhpcy5MLCJBZFN5c3RlbSIpfSxlZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnhoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnBiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMueGgoYS5wYXJlbnROb2RlKTohMX0sY206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sVWw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUGE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxVcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5wYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5QYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5QYSktTWF0aC5hYnMoZC1iLlBhKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxQbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5BZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sSWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5wYih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGdtOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUubW8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sS2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnBiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxOZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0scGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5BZChhKToiIn0sQWQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5OZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuc2t8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5Wa3x8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5PPVtdO3RoaXMubmI9IiI7dGhpcy5zPXRoaXMudmM9dGhpcy56Yj0hMTt0aGlzLlJlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5TZT0iIn1jLllqPWE7YS5wcm90b3R5cGU9e3NsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTy5sZW5ndGg7YysrKWlmKDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGFtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5uYSl7dmFyIGE9dGhpcy5vcmlnaW4ubmE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5SZT1hW2RdKX1yZXR1cm4gdGhpcy5SZX0sCmZoOmZ1bmN0aW9uKCl7aWYodGhpcy5TZSlyZXR1cm4gdGhpcy5TZTt2YXIgYT0iIjsoYT10aGlzLmFtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5TZT1hfSxrbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk8ubGVuZ3RoO2MrKylpZigwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuWWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuc3B8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtrZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixNYToiWE1MX1BBUlNFX0VSUk9SIn0sYWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixNYToiRFVSQVRJT05fRVJST1IifSwkYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTWE6IkVNUFRZX1ZBU1QifSxlZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixNYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sYmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk1hOiJMT0FEX0VSUk9SIn0sZ2U6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE1hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTWE6Ik1FRElBRklMRV9FUlJPUiJ9LGNlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE1hOiJEVU1NWV9BRCJ9fSxGPXtjZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE1hOiJOT19BRFMifSxkZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTWE6Ik5PX01FRElBRklMRVMifSx2cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixNYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLnhrfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnVkPWM7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLmRqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5Xa3x8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1jO3RoaXMuWmQ9W107dGhpcy5XaD1bXTt0aGlzLmxmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLndwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5aaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5vcT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Gbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlpkLnB1c2goe3NyYzpkLGZyYW1lOmgsbm46ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMubGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5sZltjXTtkLnR5cGU9PT1hJiZkLmNsKHRoaXMuVmwoYSkpfX0sVmw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7eHE6ITAsd3E6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7bHE6InZpZGVvIixBcToianNDdXN0b20iLEJxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQ3E6MSxWcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxqbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuWmQubGVuZ3RoO2MrKylpZih0aGlzLlpkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuWmRbY10ubm47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsYyl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5qbShjKSx2ZW5kb3I6Y30pO3RoaXMub28oKX0sRm46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnZnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMudmcoYSxjKX0sdmc6ZnVuY3Rpb24oYSxjKXt0aGlzLmxmLnB1c2goe3R5cGU6YSwKY2w6Yyx1cTohMX0pfSxvbzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuRW18fChhLm5xKHthZFNlc3Npb25JZDplLlkoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnlxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5FbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLm5rfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLm9iPWEuYmgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlkoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk9hPXt9O3RoaXMud2c9ITE7dGhpcy5kYz1bXX1jLmJqPWE7YS5wcm90b3R5cGU9e09sOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuT2woYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLnJtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSx2bzpmdW5jdGlvbigpe3RoaXMud2c9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5FYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLndnfHwodGhpcy5jLnBsYXkoKSxlLm8oay5xZCx0aGlzLmMubCgpKSl9LEZmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLm9iLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5vYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5vYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLm9iLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMub2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMub2IpO3RoaXMuYy5VYyYmdGhpcy5jLlVjKCk/dGhpcy5jLmJoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0scm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxNbDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGtjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuTWwodGhpcy5vYik7aWYoYy54IT10aGlzLk9hLnh8fGMueSE9dGhpcy5PYS55fHxjLnBvc2l0aW9uIT10aGlzLk9hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk9hLndpZHRofHxjLmhlaWdodCE9dGhpcy5PYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5PYS53aWR0aCYmMDx0aGlzLk9hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuUGUoKTtyZXR1cm59dGhpcy5PYT1jO3RoaXMuYy5VYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmRjLmxlbmd0aDthKyspdGhpcy5kY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLktmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2MuYmluZCh0aGlzKSwxMCl9LHVnOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLmRjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5kYy5wdXNoKGEpfSxQZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5ianx8WWEsRD1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5ZKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMua2p8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuTWQoYSk7dGhpcy5NZygpfSxNZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sTWc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlRhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5UYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLlNqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLiRiPXRoaXMuJGJ8fCExO3RoaXMubWc9dGhpcy5vZz10aGlzLnVoPXRoaXMudmE9dGhpcy5QZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLktsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnVoJiZ0aGlzLkVnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuSWI7YSYmYS5tYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5vZCgpO3RoaXMudWg9ITA7dGhpcy5FZygpfS5iaW5kKHRoaXMpKTt0aGlzLkFnKCl9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3RoaXMub2QoKTtpZighdGhpcy5QZiYmIXRoaXMub2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlBmJiZ0aGlzLm1nJiYhdGhpcy5vZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKX19LG9kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5paCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxpaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sQWc6ZnVuY3Rpb24oKXtpZih0aGlzLm9kKCkpe3ZhciBhPXRoaXMuaWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5vZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLm1nPWEuU3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMDApfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5qcSgpOiExfSxJYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuSWMoKTotMX0sZG06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LEtsOmZ1bmN0aW9uKGEsYil7dGhpcy4kYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLiRifHwzMDI9PXRoaXMuJGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuJGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmlhKCkpOmEuVGUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5kbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Sanx8YmI7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxHbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5iay5Iay5Gaz93aW5kb3cuT08uYmsuSGsuRmsuUXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5NZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLlRqfHxjYixkYj1uZXcgY2IodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5sbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMubG58fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuZ2E9ITE7dGhpcy5saCgpfSxsaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5VKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LExhOmZ1bmN0aW9uKCl7dGhpcy5SaCgpfSxSaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuViYmKDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLlNpfHxmYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5pYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmlhKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkJnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuQmcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLlJpfHxnYjsoZnVuY3Rpb24oYyl7Yy5UaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5NZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5MbHx8KHRoaXMuTGw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYixUPW5ldyBoYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLkRsfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxVYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cuZ2QoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3LmdkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuam4oYSl9LmJpbmQodGhpcykpO3cuZ2QoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5nZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubW0oKX0sam46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5HZCYmKGE9ZS5BbChhLHRoaXMuR2QpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5NKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkYpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkdkfHwodGhpcy5HZD1bXSksdGhpcy5HZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5NKGQpfHwodGhpcy5OKGQpLGY9bmV3IFYoZCx0aGlzLkYpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZ2Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwKKHRoaXMuYmFbYV09e30pO3RoaXMuYmFbYV1bYl18fCh0aGlzLmJhW2FdW2JdPVtdKTt0aGlzLmJhW2FdW2JdLnB1c2goYyl9LEhvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYmF8fHRoaXMuYmEmJiF0aGlzLmJhW2JdKXRoaXMuUGN8fCh0aGlzLlBjPVtdKSx0aGlzLlBjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy52ZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxtbTpmdW5jdGlvbigpe2lmKHRoaXMuUGMpZm9yKHZhciBhPTA7YTx0aGlzLlBjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuUGNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5iYVtjXVtkXSYmMDx0aGlzLmJhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYmFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmJhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5IbyhhKX19KX0pKGMpO3ZhciBqYj1jLm1rfHxqYix3PW5ldyBqYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMudGt8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9pPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuT2l8fGxiOyhmdW5jdGlvbihjKXtjLlBpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLlBpfHxtYjsoZnVuY3Rpb24oYyl7Yy5RaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTShoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRikpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkthKWlmKGI9PXRoaXMuS2FbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuS2FbYS5qYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYixvYj1uZXcgbmIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5janx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5HZz10aGlzLkdjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnFsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFsPSEwKTt2YXIgYj10aGlzLlRnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5HYz1iKTtpZighdGhpcy5HZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5HZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuemQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlUoYik7dGhpcy5Fbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTt0aGlzLmZjLnB1c2goYSl9LHJsOmZ1bmN0aW9uKCl7aWYodGhpcy5mYyYmdGhpcy5mYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdHJ5e3RoaXMuZmNbYV0oKX1jYXRjaChiKXt9fSx6ZDpmdW5jdGlvbigpe2lmKHRoaXMuR2MpcmV0dXJuIHRoaXMuR2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuVGcoYSkpcmV0dXJuIHRoaXMuR2M9YX19LFRnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRW46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLm11dGUmJnRoaXMuZWEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sdmg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy5Qanx8cWI7KGZ1bmN0aW9uKGMpe2MuT2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm1hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS56ZCgpPwp0aGlzLkMoKToodGhpcy5FZXx8KHRoaXMuRWU9MSksdGhpcy5FZSsrLDEwMDx0aGlzLkVlP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuUWo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLk0oYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgc2I9Yy5Ranx8c2IsVz1uZXcgc2IodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVsPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHRiPWMuRWx8fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LExhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuemt8fHViOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEtjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxDbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuaWEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy56Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkNuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuS2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy56Yyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmZiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmZiW2JdJiYzMDMhPXRoaXMuZmJbYl0mJjQwMyE9dGhpcy5mYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuaWEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMueWt8fHZiOyhmdW5jdGlvbihjKXtjLkFrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5NKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuQWt8fHdiLHhiPW5ldyB3Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmFsfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5VKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMucGY9ITF9LExhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnRuKCl9LmJpbmQodGhpcyksNTAwKX0sdG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5WJiZ0aGlzLlYoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMucGYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMucGYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxybzpmdW5jdGlvbigpe3RoaXMucGY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLmdrfHx6YjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMucmM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5yY3x8KHRoaXMucmM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5yY3x8dGhpcy5yYysrLHRoaXMucmM8PXRoaXMuWG0/KHRoaXMucmMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnJvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQWI9Yy5ma3x8QWI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBCYj1jLmhrfHxCYixDYj1uZXcgQmIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRGI9Yy53anx8RGI7bmV3IERiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5WKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuZWt8fEViOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubWEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMudGwoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5FYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuTm0oKTp0aGlzLkRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sdGw6ZnVuY3Rpb24oKXt0aGlzLmtnKCl8fHRoaXMuaSghMCl9LE5tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYigpOyFhLnBhJiZhLlcmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxEZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5pYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LEViOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGgpZm9yKHZhciBhPWMuYWQuRWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTGg9YVtlXSk7cmV0dXJuIHRoaXMuTGh9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5FYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLmRrfHxGYjsoZnVuY3Rpb24oYyl7Yy5hZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGtsOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBGYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmFkLkViKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5rbChhW2JdKTt0aGlzLlAoKX19KTtjLmFkLkViPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobCYmbC5wbGF5ZXJhcGkmJihhPWwucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5hZHx8R2IsSGI9bmV3IEdiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5aaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuWml8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVShiKTp0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxpcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApVYzpmdW5jdGlvbigpe3JldHVybiEwfSxUYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5xZj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnFmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMucWYmJmMhPXRoaXMucWZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGUuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEucHEpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuZ2E/dGhpcy52ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxKYj1jLk1qfHxKYixLYj1uZXcgSmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Jaj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBMYj1jLklqfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlUoYikpOnRoaXMuWCgpKTp0aGlzLlgoKTp0aGlzLlgoKTp0aGlzLlgoKX0sYmk6ZnVuY3Rpb24oKXt9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGduOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE1iPWMubWp8fE1iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMueGUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5tYSgpfS5iaW5kKHRoaXMpKX0seGU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy54ZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgTmI9Yy5sanx8TmI7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuZ2F8fHRoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLm5qfHwKT2IsUGI9bmV3IE9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Jbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFiPWMuSW98fFFiO25ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVShiKSk6dGhpcy5YKCkpOnRoaXMuWCgpfSxiaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxnbjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBSYj1jLlZpfHxSYjsoZnVuY3Rpb24oYyl7Yy5XaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLnhlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmlhKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFNiPWMuV2l8fFNiOyhmdW5jdGlvbihjKXtjLlhpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgYz1uZXcgUmIoYVtiXSk7Yy5nYXx8dGhpcy5NKGMpfHwodGhpcy5OKGMpLHdpbmRvdy5icmlkcGxheWVyPWMsKG5ldyBTYihjLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiLFViPW5ldyBUYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLk5pfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPQpiLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5VKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWCgpfSxYZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sRG46ZnVuY3Rpb24oKXt0aGlzLlpjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWmN8fCh0aGlzLlpjPSEwLHRoaXMuWGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlpjJiYodGhpcy5YZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlpjPSExKSx0aGlzLlhkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHVhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgV2I9Yy5Ea3x8V2I7KGZ1bmN0aW9uKGMpe2MuQ2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sVmg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5lYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmVjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuZWMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLlZoLmJpbmQodGhpcyksMTApfSxlYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSWs9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuaSgpKToodGhpcy5Ja3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuaSgpKX0saGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuZWMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhnLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmgoKTt0aGlzLmhnKCk7dGhpcy5HbigpfSxHbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmVjKGEpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLkFuP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLkFuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuZWMoYSkpfX0pfSkoYyk7dmFyIFhiPWMuQ2t8fFhiOyhmdW5jdGlvbihjKXtjLkVrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFdiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5nYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGEuRG4oKSxhPW5ldyBYYihhLHRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgWWI9Yy5Fa3x8WWIsWmI9bmV3IFliKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMua249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciAkYj1jLmtufHwkYjtuZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5waz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLlBoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLmJuPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5YKCl9ZWxzZSB0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxiaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ibn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuVmQoYSl9LmJpbmQodGhpcykpfSxWZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5QaCYmKHRoaXMuUGg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgTj1jLnBrfHxOOyhmdW5jdGlvbihjKXtjLm9rPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5JZSlpZih0aGlzLktifHwKKHRoaXMuS2I9MCksdGhpcy5LYisrLDE1PHRoaXMuS2Ipe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuZW8oKTp0aGlzLmkoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuaSgpOnRoaXMuaSghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkllPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy50YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLkspLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHRiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLks9YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz0KcS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVmE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5nYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKSk7dGhpcy52ZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGFjPWMucWt8fGFjLGJjPW5ldyBhYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBjYz1jLk1pfHxjYztuZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Haj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLkdqfHxaOyhmdW5jdGlvbihjKXtjLkZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnJoPTA7dGhpcy5LPXRoaXMuS3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuTWM9dGhpcy5CYT10aGlzLmpkPSExO3RoaXMuVGg9ZS5PYigxMCk7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5wYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnZiKCksITA7dGhpcy5yaCsrO2lmKDEwPHRoaXMucmgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuaSghMCk6dGhpcy5pKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy56aC5iaW5kKHRoaXMpLDEwMCksITF9LHZiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmIoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnZhPQohMH0sY2E6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCk/KHRoaXMudygpLHRoaXMuaWEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Ganx8YWE7KGZ1bmN0aW9uKGMpe2MuSGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLAp0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5Ianx8ZGMsZWM9bmV3IGRjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMucmt8fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLApiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlUoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5YKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGdjPWMuaWp8fGdjOyhmdW5jdGlvbihjKXtjLmhqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLkNnKCl9LENnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgaGM9Yy5oanx8CmhjOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBnYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5nYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLk0oYSkpe3RoaXMuTihhKTsobmV3IGhjKGEsdGhpcy5GKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgaWM9Yy5qanx8aWMsamM9bmV3IGljKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMudW18fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5HaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5VKGEpOnRoaXMuWCgpKTp0aGlzLlgoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGxjPWMuR2l8fGxjOyhmdW5jdGlvbihjKXtjLkZpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLndlKCk7dGhpcy56ZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSx0YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxEYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LHpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChhPWEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmEuYWRzTG9hZGVyKWZvcih2YXIgYj0wO2I8YS5hZHNMb2FkZXIubGVuZ3RoO2IrKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMuaWEoKSk6dGhpcy5pKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy56Zy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLndlLmJpbmQodGhpcyksMTAwKX0sd2U6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuaSgpOnRoaXMuaSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy53ZS5iaW5kKHRoaXMpLDEwMCl9fSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWEuYmluZCh0aGlzKSwxRTQpO3RoaXMuQyhhKX19KX0pKGMpO3ZhciBtYz1jLkZpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFNhOmZ1bmN0aW9uKGEpe2E9Cm5ldyBsYyhhKTthLmdhP3RoaXMuUCgpOnRoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IG1jKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlNhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5TYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBuYz1jLkhpfHxuYyxvYz1uZXcgbmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGM9Yy5DbHx8cGM7bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkFoPXRoaXMuQ2g9dGhpcy5CaD0hMTt0aGlzLklkPVtdO3RoaXMudWY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHc/bnVsbDp3LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBaYj9udWxsOlpiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLEJyaWRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWI/bnVsbDpVYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEphP251bGw6SmEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9jP251bGw6b2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLiRqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuZW0oYSk6W10sYzt0aGlzLkNoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkJoPQohMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sdGhpcy5haShjKX1lbHNlIGZvcihkIGluIHRoaXMudWYpe2lmKHRoaXMuQWgpYnJlYWs7Yz10aGlzLnVmW2RdO3RoaXMuVGYoYykmJih0aGlzLklkLnB1c2goYyksdGhpcy5haShjKSl9fSxUZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHE/ITA6ITF9LGVtOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYztmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkPWFbZV0sZD10aGlzLnVmW2RdLHRoaXMuVGYoZCkmJmMucHVzaChkKTtyZXR1cm4gY30sYWk6ZnVuY3Rpb24oYSl7dGhpcy5UZihhKSYmYS5mKCl9LHRvOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiByJiYhdGhpcy5CaClmb3IodGhpcy5BaD0hMCxhPTA7YTx0aGlzLklkLmxlbmd0aDthKyspdGhpcy5JZFthXS5WYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLklkW2FdLlZiKX19fSkoYyk7dmFyIHFjPQpjLiRqfHxxYyxMPW5ldyBxYztMLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYz1jLlZtfHxyYztuZXcgcmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGE9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1hLmluZGV4T2YoImhvbWFkIil8fC0xIT1hLmluZGV4T2YoImhkLW1haW4iKSlhPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWEuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1hLnN1YnN0cmluZyhhLmluZGV4T2YoIjoiKSsxLGEuaW5kZXhPZigiaXMgbm90IiktCjEpLGUuSGMoay5SbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuSGMoay5mbiksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciB3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHVjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLGw9ITE7SC5mYSgpO0gud2goKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmZhKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC53aCgpLApmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtILmZhKCk7dmFyIHhjPXdjKGZ1bmN0aW9uKCl7ZS5XZyh3aW5kb3csSC53bSgpLHtpZDp4Y30pfSw1MDApLGlhPWUuWSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBzYz1jLkVqfHxzYztuZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUWg9dGhpcy5jb25mPXRoaXMuSGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkRkPTA7dGhpcy5lYj0iIjt0aGlzLkpkPVtdO3RoaXMuS2Q9MDt0aGlzLlNoPSExO3RoaXMucmY9W107ZS5yYigibmV3QWRkZWxpdmVyeSIpfWMuSWk9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5RaD1hfSxCZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYTt0aGlzLmViPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxXbjpmdW5jdGlvbihhKXt0aGlzLkhiPWF9LFZuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGN9LFZjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLnhtKCkpdGhpcy5IYi5nKHRoaXMuSGIuTGMsdGhpcy5IYi5xYSx0aGlzLkhiLnRmLGZ1bmN0aW9uKCl7dGhpcy5WYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuSGIuZ2MpO2Vsc2UgaWYodGhpcy5vbSgpKXRoaXMuU24oZnVuY3Rpb24oKXt0aGlzLlZjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5FYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPQpuZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLnZvKCk7bC5leGl0RnVsbHNjcmVlbigpO2UucmIoIm5ld0hvbWFkRGlzcGxheSIpO1E9bD1uZXcgUGEobCx0aGlzLkhiLGgpO2wuVG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLldtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWYmJihkPXRoaXMucGxheWVyLmFmKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLmNmKGEsZCxmKTt0aGlzLnBsYXllci5kaShsKX19LHhtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuRGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktCnRoaXMuRGQuZ2V0VGltZSgpLHRoaXMuRGQ9YSwzRTU8Yz8hMDohMTt0aGlzLkRkPWE7cmV0dXJuITF9LGxvOmZ1bmN0aW9uKCl7ZS5yYigicHJlcm9sbCIpO2UuQWYoInByZXJvbGwiKTt2YXIgYT10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkhhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5TZyhhKSk/dGhpcy5WYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLnFkLHRoaXMucGxheWVyLmwoKSkpfSxrbzpmdW5jdGlvbihhKXtpZighdGhpcy5RaCl7ZS5BZigicG9zdHJvbGwiKTtlLnJiKCJwb3N0cm9sbCIpO3RoaXMuJG4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkhhKCJwb3N0cm9sbEFkVGFnIikpOwooZD10aGlzLlNnKGQpKT90aGlzLlZjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnFkLHRoaXMucGxheWVyLmwoKSkpfX0sU2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LEpuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuaW8odGhpcy5rby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5MYSgpfSxPZDpmdW5jdGlvbihhKXtlLnJiKCJtaWRyb2xsIik7ZS5BZigibWlkcm9sbCIpO2lmKCF0aGlzLkZoKXt0aGlzLkZoPSEwO3ZhciBjPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSGEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlZjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLm8oay5xZCx0aGlzLnBsYXllci5sKCkpKX19LEluOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuWm4odGhpcy5PZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5mZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5sbygpO3RoaXMucGxheWVyLmZmJiZ0aGlzLkluKCk7dGhpcy5KbigpfSxLbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkpkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy50cChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLktkPXRoaXMuSmQubGVuZ3RofSxvbTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5LZCYmKGE9ITApO3JldHVybiBhfSxTbjpmdW5jdGlvbihhKXt0aGlzLlNoPWE7Zm9yKGE9MDthPHRoaXMuSmQubGVuZ3RoO2ErKyl0aGlzLkpkW2FdWyJmdW5jdGlvbiJdKHRoaXMueG4uYmluZCh0aGlzKSl9LHhuOmZ1bmN0aW9uKGEpe3RoaXMuS2QtLTthJiZ0aGlzLnJmLnB1c2goYSk7MD49dGhpcy5LZCYmdGhpcy5TaCgpfSxXbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5yZi5sZW5ndGg7ZCsrKWM9dGhpcy5yZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5JaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLllpfHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGt1aVNoaXNoV3VzaG9kb28sa3VpU2hpc2hXdXNob2Rvbyk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.219.74.191
Frankfurt am Main, Germany,
ASN16509
(AMAZON-02, 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 7103
|
265 B
436 B
|
20ms
20ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
General
- Full URL
- https://videos.giga.de/homad/giga-ssl.json?cache=7715833800
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGt1aVNoaXNoV3VzaG9kb289a3VpU2hpc2hXdXNob2Rvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cubWZ8fCh3Lm1mPTApO3cubWYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5tZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZighbCl1YyhlYSw1MCk7ZWxzZSBpZighZS5wbil7bC5wYXVzZUJ1dHRvbnx8KGwucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLm11dGVCdXR0b258fChsLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbC5za2lwYWJsZUJ1dHRvbnx8KGwuc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTtsLnNraXBCdXR0b258fChsLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobC5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtsLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxtKX0pfW0uZyhsLmdsb2JhbENvbmZpZyxsLmNsaWVudENvbmZpZyxsLnByZWNoZWNrZWQsbC5vblJlYWR5LGwub25GYWlsdXJlLGwpO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPWwuc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHQoYyxhKXtpZihlLmJsKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkVjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP20uSWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZmE7Yi5CZihjKTtiLlduKG0pO2IuVm4obCk7Yi5LbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKG0ud2IubGVuZ3RoKXt2YXIgYj1tLndiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGc7Zz1lLmNvKHsiW0xPQURTQ1JJUFRdIjplLlkoMTApLCJbVVRJTFNdIjplLlkoMTApLCJbQ0FMTEJBQ0tdIjplLlkoMTApfSk7d2luZG93W2dbIltMT0FEU0NSSVBUXSJdXT1lLkRoLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBnIGluIGIpbFtnXT1iW2ddO3QoYyxhKX07Zz1iLnNjcmlwdHMuc2hpZnQoKTspZS5EaChnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxtKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmNrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5ibD0hMTt0aGlzLkpiPSJzZXR1cCI7dGhpcy5XYz1bXTt0aGlzLnplKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMud24uYmluZCh0aGlzKSk7dGhpcy5xYj17fTt0aGlzLnBoPXt9O3RoaXMueWY9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt1bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5xYlthXSsiXyIpO3JldHVybiBifSxqYzpmdW5jdGlvbigpe3RoaXMueWZ8fCh0aGlzLnlmPWUuWSgxMCkpO3JldHVybiB0aGlzLnlmfSxyYjpmdW5jdGlvbihiKXt0aGlzLnFiW2JdfHwodGhpcy5xYltiXT0wKTt0aGlzLnFiW2JdKz0xOzU8dGhpcy5xYltiXSYmIXRoaXMucGhbYl0mJih0aGlzLnBoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudW8oKSwhMCkpfSx6ZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFRrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGxhOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSx3bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy52bihiLmRhdGEpfSx2bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx1ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LExnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmVoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5FZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGVoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFJrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUuTmwoYikpcmV0dXJuOyhhPXRoaXMuTGcoYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE5sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxWZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sSW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sTWU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZGg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LGZvOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sRGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy54bChhKSxmPTA7ZjxkLmxlbmd0aDtmKyspdGhpcy5mbyhiLGRbZl0ua2V5LGRbZl0udmFsdWUpfSxkbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0seGw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9mPWNbMV0udHJpbSgpOmY9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLmRsKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpmfTthLnB1c2goZCl9cmV0dXJuIGF9LEtmOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHloOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFZlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxmPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2Y9aC5oZWlnaHQ7MD5oLnRvcCYmKGYrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZik7Yz49YSYmKGU9ITApO3JldHVybiBlfSxXZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlZlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldlKGIpfS5iaW5kKHRoaXMpLDEwMCl9LE9iOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxPZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZjtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylmPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2YsYXw9MDtyZXR1cm4gYX0sRWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWI+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBmLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx4PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1iLmNoYXJDb2RlQXQoZik8PDI0fGIuY2hhckNvZGVBdChmKzEpPDwxNnxiLmNoYXJDb2RlQXQoZisyKTw8OHxiLmNoYXJDb2RlQXQoZiszKSxyLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZik7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cltiKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWg7bD14O3k9azt0PW07Zm9yKGY9MDsxOT49ZjtmKyspcT1kKHAsNSkrKG4mbHx+biZ5KSt0K2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7Zm9yKGY9MjA7Mzk+PWY7ZisrKXE9ZChwLDUpKyhuXmxeeSkrdCtjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1sLGw9ZChuLDMwKSxuPXAscD1xO2ZvcihmPTQwOzU5Pj1mO2YrKylxPWQocCw1KSsobiZsfG4meXxsJnkpK3QrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bCxsPWQobiwzMCksbj1wLHA9cTtmb3IoZj02MDs3OT49ZjtmKyspcT1kKHAsNSkrKG5ebF55KSt0K2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3g9eCtsJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeCkrYShrKSthKG0pKS50b0xvd2VyQ2FzZSgpfSxDYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxmLHAsYyxlLGgseD0wO3g8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHgrKyksZj1iLmNoYXJDb2RlQXQoeCsrKSxwPWIuY2hhckNvZGVBdCh4KyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZik/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx2ZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGg9ITEseD0hMSxrPSExLGw9ITE7dHJ5e2E9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuZGM/ITA6ITF9Y2F0Y2godCl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSx4PSFoJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0oa3x8cCkmJiEhd2luZG93LkNTU31jYXRjaChxKXt9Yi5pc1BoYW50b21KUz1hO2IuaXNDaHJvbWVIZWFkbGVzcz1kO2IuaXNGaXJlZm94SGVhZGxlc3M9ZjtiLmlzT3BlcmE9cDtiLmlzRmlyZWZveD1jO2IuaXNTYWZhcmk9ZTtiLmlzSUU9aDtiLmlzRWRnZT14O2IuaXNDaHJvbWU9aztiLmlzQmxpbms9bDtyZXR1cm4gYn0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj17S2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCnNtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LFVqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxKajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LGprOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sWWs6ZnVuY3Rpb24oKXtyZXR1cm4gYi5LaSgpfHxiLlVpKCl8fGIuc20oKXx8Yi5VaigpfHxiLkJrKCl8fGIuSmooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuWWsoKX0sU2w6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGY9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZlsxXSkpcmV0dXJuIGQ9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhhKXx8W10sIklFICIrKGRbMV18fCIiKTtpZigiQ2hyb21lIj09PWZbMV0mJihkPWEubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1kKSlyZXR1cm4gZC5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtpZighYilyZXR1cm4gZlsxXTtmPWZbMl0/W2ZbMV0sZlsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShkPWEubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZi5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBmLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFthW2ZdXT1iW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxnKXthJiYoZC5xdWVyeUtleVthXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZj0wLHA9Yi5sZW5ndGg7ZjxwOysrZilhLmhhc093blByb3BlcnR5KGJbZl0pfHwoZC5wdXNoKGJbZl0pLGFbYltmXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sZm06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxmLnB1c2goYltwXSk7cmV0dXJuIGZ9LG1vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZj0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhmPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmYpOihkPWIuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LFpnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEFmOmZ1bmN0aW9uKGIpe3RoaXMuSmI9Yn0sV2c6ZnVuY3Rpb24oYixhLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5KYjt0aGlzLnJlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsCmQpKSxiLmRpc3BhdGNoRXZlbnQoZil9Y2F0Y2gocCl7dGhpcy5wbj0hMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEhjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5XZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHo9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih6PWsuU2EoYixhKSk7ZiYmKHo9ay5TYSh6LGYpKTtwJiYoej1rLlNhKHoscCkpO2MmJih6PWsuU2EoeixjKSk7aCYmKHo9ay5TYSh6LGMpKTtlLkhjKHopfSx5bjpmdW5jdGlvbihiKXt2YXIgYT17fTsKaWYoIWIuY29kZSlyZXR1cm4hMTtpZihiLnNwZWNpYWxfdHJhY2t8fGIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmZtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPQpiLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LG5vOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5qYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMucmUoYil9LHJlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMueW4oYik7aWYoYSlpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uU2MoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjsKYi5kYXRhLmhvbWFkX2F0PWE7bS5KYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGY9bS5TYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5KYShmLGZ1bmN0aW9uKGQpe3ZhciBmPQohMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxXZDpmdW5jdGlvbihiKXtpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGEsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uU2MoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLkphKGIpfX0sZGY6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uamwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGYoKX0uYmluZCh0aGlzKSwKNTAwKX0sS2U6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnBiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxOZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0scGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5BZChiKToiIn0sQWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5OZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHhnOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5YZShiKXx8dGhpcy5JbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LndmJiZ3aW5kb3cuc2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5WZyhiKSlyZXR1cm4gdGhpcy5WZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQ2IoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPQohMTtkPSExO2Q9dGhpcy5iYihiLGEuQWEsYyxmdW5jdGlvbihiKXtlPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWEuQ2QoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUmsoZSxiKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYixhLGQsZixjLGUsaCx6KXt2YXIgaz1lfHxtO2U9ITA7eiYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWUuZGF0YVt0XT1kW3RdO3JldHVybiBrLkphKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmIoYixhLGQsZixjLGssaCx6KX0uYmluZCh0aGlzKSw1MDApfSxFZDpmdW5jdGlvbihiLGEsZCxmLGMsZSxoKXt2YXIgaz0hMDtoJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIHggaW4gaClkKz0iJiIreCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbeF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUm06ZnVuY3Rpb24oYixhLGQpe3RoaXMuRWQoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuV2MpZm9yKHZhciBjIGluIHRoaXMuV2MpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5XY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuQ2IoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxEaDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkNiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5iYihiLGYuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlJtKGYuQ2QoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LGNvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLldjPWJ9LHRwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5iYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxaazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LEJtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylpZihhW2ZdPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnBqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZW49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuRmw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnFnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmlnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5uZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5yZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSms9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLmxnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuV289e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmRuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkdsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5xcD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnZsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEucWQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5FYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EucGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkxrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5mZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Eub2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EucWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLktrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5obj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkZkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlFmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5JZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuUm89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5mbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLklsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e09lOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZixjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBNYXRoLmFicyhhKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk9hfHwieCIpfSxibTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuT2F8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHlkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy55ZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLnlkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5PZSh0aGlzLmphKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMueWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHdtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHdoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLk9lKHRoaXMuYm0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy55ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnZqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChnW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5nP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy50bXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5LYT17fTt0aGlzLkY9bnVsbDt0aGlzLlRjPTEwMDt0aGlzLlBiPTA7dGhpcy5WYT0xNTA7dGhpcy5WYj0wO3RoaXMuWG4oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlBiPD10aGlzLlZhPyh0aGlzLlBiKyssdGhpcy5WYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlRjKSk6MD50aGlzLlZhJiYodGhpcy5WYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlRjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGI+dGhpcy5WYT8hMDohMX0sdmY6ZnVuY3Rpb24oKXt0aGlzLlBiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuS2FbYS5qYSgpXT0KYTtMJiZMLkNoJiZMLnRvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBlLk1lKHRoaXMuS2EpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLkthKWlmKGI9PXRoaXMuS2FbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuS2FbYS5qYSgpXT8hMDohMX0sQ206ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuS2EpaWYoYS5pZD09dGhpcy5LYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx0cTpmdW5jdGlvbihhKXt0aGlzLkthW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLlpqfHxxOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuVGM9MTA7dGhpcy5QYj0wO3RoaXMuVmE9NTA7dGhpcy5WPW51bGw7dGhpcy5nYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuSWI9IiI7dGhpcy5OZz0hMTt0aGlzLkooKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGc9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZylhLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxMYTpmdW5jdGlvbigpe30saW86ZnVuY3Rpb24oYSl7dGhpcy5WPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVn0sWm46ZnVuY3Rpb24oYSl7dGhpcy5nZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdmfSxmZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuUGI8PXRoaXMuVmEmJih0aGlzLlBiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5UYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sTWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx2cTpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk5rKCk7dGhpcy5NZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxOazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5ZKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFRlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYX0sWDpmdW5jdGlvbigpe3RoaXMuZ2E9ITB9LFVjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxhZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLkliPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5JYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuSWImJihhPSEwKTtyZXR1cm4gYX0scXE6ZnVuY3Rpb24oKXt0aGlzLk5nfHwodGhpcy5OZz0hMCl9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5KaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmZnPSIxIjt0aGlzLmdnPSIyIjt0aGlzLkdrPSIzIjt0aGlzLmJkPTA7dGhpcy5abT0zMDt0aGlzLlpiPVtdO3RoaXMua2I9W107dGhpcy50Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5zZz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuYmQ7dGhpcy5pZD1lLlkoMTApO3RoaXMuQmYoYSk7dGhpcy5ZbihiKX0sZjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxlLmRmKCkpfSxKaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEubWMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmphKCldfHwod2luZG93W2IuZmEoKV1bYS5qYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmphKCldLmluaXRpYXRvcj1lLmpjKCkpO3dpbmRvd1tiLmZhKCldW2EuamEoKV1bZS5qYygpXT93aW5kb3dbYi5mYSgpXVthLmphKCldW2UuamMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmphKCldW2UuamMoKV09MX0sem06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSTt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5qYSgpXSYmd2luZG93W2cuZmEoKV1bYS5qYSgpXS5pbml0aWF0b3IhPWUuamMoKSYmKHRoaXMuQ2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnZtKCk7CmlmKCF0aGlzLnptKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkNmKCk7cmV0dXJufXRoaXMuQ2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxnKTt0aGlzLnBpKCk7dGhpcy5zZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5aYi5wdXNoKGEpLHRoaXMua2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5aYiYmMDx0aGlzLlpiLmxlbmd0aCYmKHRoaXMuWmI9ZS51bmlxdWUodGhpcy5aYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWmIuam9pbigiLCIpKSk7aWYodGhpcy5rYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmtiLmxlbmd0aDtnKyspdGhpcy50Y1t0aGlzLmtiW2ddLnJlYXNvbl09PXRoaXMudGNbYV0mJmIucHVzaCh0aGlzLmtiW2ddLmRldGFpbCksdGhpcy50Y1t0aGlzLmtiW2ddLnJlYXNvbl08CnRoaXMudGNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmtiW2ddLmRldGFpbCksYT10aGlzLmtiW2ddLnJlYXNvbik7dGhpcy50Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihnPWUudW5pcXVlKGIpLGE9YSsiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmZnfSxDZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuZ2d9LGVvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ha30sbWE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkfSxrZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5mZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuZ2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmJkfSxCZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxZbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuSml8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5ybnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuZWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVShhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZWp8fG9hOyhmdW5jdGlvbihjKXtjLmZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmZqfHxwYTsoZnVuY3Rpb24oYyl7Yy5naj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuZ2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkJsfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm1oPXRoaXMuc2I9ITE7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubWg9ITApO3RoaXMuTWg9ITE7dGhpcy5VZygpO3RoaXMuSGUoKTt0aGlzLnVsPSExfSxVZzpmdW5jdGlvbigpe3RoaXMuc2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnNiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk1oPWE7aWYodGhpcy5taCl7dGhpcy5IZSgpO2lmKHRoaXMuc2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxIZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNiKXt2YXIgYT10aGlzLk1oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMuc2I9ITApO3RoaXMuVShiKX19LExhOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuT2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLk9kKGIpfS5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmdmJiYoMCx0aGlzLmdmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LEplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Canx8c2E7KGZ1bmN0aW9uKGMpe2MuQWo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG1hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5iZDt0aGlzLmlzUGxheWluZz10aGlzLm5lPSExO3RoaXMucGU9MTt0aGlzLmNkPVtdO3RoaXMuQmI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLm5lPSExO3RoaXMucGU9MTt0aGlzLmNkPVtdO3RoaXMuQmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5wZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkJiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGc9MDtnPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2crKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ddLnRhZyl7dGhpcy5CYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkJiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkJiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuQmI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPApkLmxlbmd0aDtnKyspYS5vbihkW2ddLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZ10mJih0aGlzLm5lPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZ10mJnRoaXMuSmgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5abSYmIXRoaXMuemEoKSYmKHRoaXMuQmI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubWEoKSx0aGlzLmdldFBsYXllcigpLnVsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuSWI7YiYmKGIuSGQoKSxiLnJkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5jZC5pbmRleE9mKGIpJiZ0aGlzLmNkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuaWEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5jZC5sZW5ndGg+PXRoaXMucGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5HZT90aGlzLkdlKys6dGhpcy5HZT0xOnRoaXMuRmU/CnRoaXMuRmUrKzp0aGlzLkZlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLktmKGIudmlkZW9UYWcpP2Iuc2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5uZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuRmU+dGhpcy5HZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlVnKCksYi5IZSgpLGIuc2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Banx8dGE7KGZ1bmN0aW9uKGMpe2MuQ2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5XbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpnLnNifHx0aGlzLk0oZyl8fHRoaXMuQ20oZyl8fCh0aGlzLk4oZyksZz1uZXcgdGEoZyx0aGlzLkYpLGcuSigpLGcuZigpKX19dGhpcy5QKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxXbDpmdW5jdGlvbigpe3ZhciBhPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQ2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLk1tfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOnRoaXMuWCgpKTp0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuVmQoYSl9LmJpbmQodGhpcykpfSxWZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5WJiZ0aGlzLlYoKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGcpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnZrfHx4YTsoZnVuY3Rpb24oYyl7Yy51az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuTWM9dGhpcy5CYT10aGlzLmpkPSExO3RoaXMuVGg9ZS5PYigxMCk7dGhpcy5SZj0hMDt0aGlzLnpjPXRoaXMudGg9ITE7dGhpcy5jbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSWgoKSx0aGlzLmZsKCksdGhpcy52YigpKX0sY246ZnVuY3Rpb24oYSl7cmV0dXJuIGUuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxycTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuamEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlcsIjsiLHR5cGVvZiBhLlcsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVz9hLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlc/dHlwZW9mIGEuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5HYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5HYT9hLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkdhP3R5cGVvZiBhLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5HYT9hLkcuR2EoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLkdhP3R5cGVvZiBhLkcuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5sZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmxlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEubWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5tZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS52ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS52ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcudmU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy52ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApLYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLkpjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sZ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5NYyl7dmFyIGE9dGhpcy5KYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLk1jPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5NYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLk1jfSxBbTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoKXt2YXIgYT10aGlzLkpjKCksYj10aGlzLnltKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuc2g9ITApfXJldHVybiB0aGlzLnNofSx5bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuamQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmpkPSEwKTtyZXR1cm4gdGhpcy5qZH0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuSG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sSG46ZnVuY3Rpb24oKXt0aGlzLnpjPSEwO3ZhciBhPXRoaXMuZ2goKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5IKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5BYz0hMDtlLkgoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuQWM9ITA7aWYoZS5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuQWM9ITA7ZS5IKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5BYz0hMDtlLkgoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkFjPSEwO2UuSCgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuS2cmJmEuYWRzJiYodGhpcy5LZz1hLmFkcyk7cmV0dXJuIHRoaXMuS2d9LGZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5tYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5KaCgpfS5iaW5kKHRoaXMpKX0sdGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuSWEmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmdoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRkKCl9LmJpbmQodGhpcyksNTApKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQW0oKSl7dmFyIGI9dGhpcy5KYygpLGc9dGhpcy5LYygpO2ImJmcmJih0aGlzLnpjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudGg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkpjKCksYT10aGlzLktjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnRoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmCmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGdsOmZ1bmN0aW9uKCl7dGhpcy5GY3x8KHRoaXMuRmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkZjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuRmM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuRmMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5GYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2woKX0uYmluZCh0aGlzKSwxMCl9LAp0YjpmdW5jdGlvbigpe3JldHVybiBlLkRlPyExOnRoaXMudmF9LERhOmZ1bmN0aW9uKCl7aWYodGhpcy5xbSgpKXt0aGlzLnZhPSEwO2lmKGUuSCgiZ2lnYS5kZSIpfHxlLkgoInNwaWVsZXRpcHBzLmRlIil8fGUuSCgia2luby5kZSIpfHxlLkgoImRlc2lyZWQuZGUiKSl0aGlzLlJmPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scW06ZnVuY3Rpb24oKXtpZigwPD1lLlVhKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZS5IKCJnaWdhLmRlIil8fGUuSCgic3BpZWxldGlwcHMuZGUiKXx8ZS5IKCJraW5vLmRlIil8fGUuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkVkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuU2woKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLkRlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpPyh0aGlzLncoKSx0aGlzLmlhKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlJmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlJmLGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxvbDpmdW5jdGlvbigpe3RoaXMuaHF8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2woKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy51a3x8eWE7KGZ1bmN0aW9uKGMpe2Mud2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2ddKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLk1lKGIpKXthPWI7Zm9yKHZhciBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGI9bmV3IHhhKGFbZ10pLGIuZ2F8fHRoaXMuTShiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5UYyl9fSl9KShjKTsKdmFyIHphPWMud2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLk5qfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5mPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5YKCk7cmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8CihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLlgoKX0sc246ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JYixnPXRoaXMuamEoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIubWMmJigwPD1nLmluZGV4T2YoZCl8fGIuSGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLm5mPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sdWE6ZnVuY3Rpb24oKXt0aGlzLm5mKys7aWYoMTA8dGhpcy5uZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LExhOmZ1bmN0aW9uKCl7fSxWZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7CnZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5JZSlpZih0aGlzLktifHwodGhpcy5LYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLktiKyssMTU8dGhpcy5LYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLkllPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy50YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLkspLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx0YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZz0hMDtnfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBnfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLkJhKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5KbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkpsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Euc24oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiYKd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBSKGFbYl0pO2cuZ2F8fHRoaXMuTShnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy5Cbnx8RmE7bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLmRoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudW49YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLnVuKXtjYXNlICJiZWZvcmUiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZywKYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVShnKTt0aGlzLndkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy53ZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMud2QpfSxrYTpmdW5jdGlvbigpe3JldHVybiEwfSxubDpmdW5jdGlvbigpe2UueWgodGhpcy53ZCk7ZS5WZSh0aGlzLndkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sYWY6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBHYT1jLnlqfHxHYTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLApiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIEhhPWMueGp8fEhhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLmRoKGEsImVsZW1lbnRJRCIpO2lmKGUueWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5NKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuVmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuVmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhLEphPW5ldyBJYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBLYT0KYy5Eanx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnNqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sT2s6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy5zanx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCxmLGMpe3RoaXMuRWE9Yjt0aGlzLllnPXRoaXMuRWk9ITE7dGhpcy5LaD1kO3RoaXMuaWk9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuRWE9bmV3IEMoYikpO3ZhciBoPQp0aGlzLmpiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbSYmbS5ZZSh0aGlzLkVhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2YmJjQhPWgucmVhZHlTdGF0ZSYmZihoKX0uYmluZCh0aGlzKX1jLnRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBiKXt2YXIgYT1iLGI9IiIsZDtmb3IoZCBpbiBhKWIrPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLllnJiYoYis9CiImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5qYi51cmxDYWxsZWQ9dGhpcy5FYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5qYi5vcGVuKHRoaXMuRWEubWV0aG9kLHRoaXMuRWEudXJsLCExKTp0aGlzLmpiLm9wZW4odGhpcy5FYS5tZXRob2QsdGhpcy5FYS51cmwsITApLHRoaXMuRWl8fCh0aGlzLmpiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5qYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5qYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5qYi5zZW5kKGIpfWNhdGNoKGYpe2I9dGhpcy5FYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8dGhpcy5FYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpLG0mJm0uWWUodGhpcy5FYS51cmwpJiYKIWI/ZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOm0uWWUodGhpcy5FYS51cmwpLHRoaXMuS2gmJnRoaXMuS2goKX1yZXR1cm4gdGhpcy5qYn19fSkoYyk7dmFyIExhPWMudGp8fExhOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5GYT10aGlzLmllPSExfWMuYWo9YTthLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxhbzpmdW5jdGlvbihiKXt0aGlzLkZhPWJ9LE1uOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3hwOiJBZENsaWNrVGhydSIsenA6IkFkRXJyb3IiLEFwOiJBZFN0b3BwZWQiLERwOiJBZExpbmVhckNoYW5nZSIsRXA6IkFkVGFnUGFyc2VkIixIcDoiQWRWaWRlb0NvbXBsZXRlIixLcDoiQWRMb2FkZWQiLExwOiJBZFNraXBwZWQiLE1wOiJBZFN0YXJ0ZWQiLEJwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsQ3A6IkFkSW1wcmVzc2lvbiIsCnlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLmllLGFbZF0pfSxMbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuRmEmJnRoaXMuRmEuaGUpZm9yKHZhciBhIGluIHRoaXMuRmEuaGUpdGhpcy5GYS5oZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkZhLHRoaXMuRmEuaGVbYV0pO3RoaXMuRmEmJnRoaXMuRmEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuRmEuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmllJiYKdGhpcy5NbigpO3RoaXMuRmEmJnRoaXMuTG4oKX19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5JYT0hMTt0aGlzLmJjPSIiO3RoaXMua2Q9dGhpcy5hYz10aGlzLmxiPW51bGw7dGhpcy5RZz10aGlzLndiPXRoaXMuJGU9ITE7dGhpcy5BYT0iIjt0aGlzLlplPSExO3RoaXMucWE9dGhpcy5MYz0iIjt0aGlzLlVlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnRmPSExO3RoaXMuaGE9W107dGhpcy5RZT10aGlzLlJiPSIiO3RoaXMuZmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5lZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMueWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuWWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuU2I9IiI7dGhpcy5UYj1bXTt0aGlzLlViPVtdO3RoaXMuWGM9W107CnRoaXMucWM9IiI7dGhpcy5EYj0hMTt0aGlzLlVkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubGM9ITE7dGhpcy5GZz10aGlzLiRkPW51bGw7dGhpcy5HZj10aGlzLmhiPXRoaXMuUGc9dGhpcy5ZZD10aGlzLlNmPXRoaXMubWQ9dGhpcy51Yz0hMTt0aGlzLiRhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkJkPTA7dGhpcy5vaD0hMTt0aGlzLm5oPTFFMzt0aGlzLkJjPSExO3RoaXMuUGE9MUUzO3RoaXMuZGQ9dGhpcy5lZD0iIn1jLnVqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLklhLGFkdGFncGFyYW1ldGVyOnRoaXMuYmMsYWR0YWdtb2RpZmllcjp0aGlzLmxiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5hYyxhZHRhZ3JlZ2V4OnRoaXMua2QsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuJGUsc2lkZWxvYWRzOnRoaXMud2IsZGlzYWJsZXRlc3RzOnRoaXMuUWcsaG9tYWRBbGlhczp0aGlzLkFhLAppc0luaXRpYWxpemVkOnRoaXMuWmUsZ2xvYmFsQ29uZmlnOnRoaXMuTGMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLlVlLHNlcnZlcjp0aGlzLmhhLHN2bUNvbmZpZzp0aGlzLlJiLGhvbWFkQWRwYXRoOnRoaXMuUWUsSE9NQURfVkVSSUZJRUQ6dGhpcy5mZSxIT01BRF9CTE9DS0VEOnRoaXMuZWUsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMuWWIsdGVzdEhpZGU6dGhpcy5TYix0ZXN0VGFnczp0aGlzLlRiLHRlc3RUYWdzSlM6dGhpcy5VYix0ZXN0VGFnc1hIUjp0aGlzLlhjLHRlc3QzUENvb2tpZTp0aGlzLnFjLHRocm90dGxlOnRoaXMuVWQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5sYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkZnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMudWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1kLAp1c2VTdHJpY3RDaGVja3M6dGhpcy5TZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5ZZCxjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy55YSxzZXJ2ZXJJZDp0aGlzLnhmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5hYix2cGFpZDp0aGlzLmhiLHNraXBBbGxvd2VkOnRoaXMuR2Ysdm1hcHM6dGhpcy5YZixhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuQmMsYWRGYWxsYmFja1VSTDp0aGlzLmVkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5kZH19LFVuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLklhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLmJjPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMubGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYKKHRoaXMuYWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5rZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLiRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy53Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlFnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5aZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5MYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlVlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaGE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5SYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuUWU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuZmU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5lZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYKKHRoaXMueWI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5ZYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuU2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuVGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5VYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlhjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5xYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuVWQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmxjPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLkZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnVjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMubWQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuU2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5ZZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuJGE9Yi5jb25maWdGYWlsdXJlcyk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy54Zj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmFiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuaGI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuR2Y9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuWGY9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5CYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuZWQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5kZD1iLmFkRmFsbGJhY2tDb25maWcpfSxubTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2FdJiYxPT10aGlzLiRhW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LHpmOmZ1bmN0aW9uKGIpe3RoaXMuJGFbYl09ITB9LFhsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYV0mJjE9PXRoaXMuJGFbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sU2Q6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKYj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk9iKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWUuWmsoYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZj0iIixjPSIiLGU9IiIsaD0iIjtpZighdGhpcy5JYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2Y9dGhpcy5YZShiKTtjPXRoaXMuYWEoYik7Zj8odGhpcy5OYygpP2U9YjplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5TYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLmJjfHx0aGlzLmxifHx0aGlzLmFjfHx0aGlzLmtkKSYmKGg9dGhpcy5hbihoKSk7Yj1uZXcgQyhlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKToKdGhpcy5abChjLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5DYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LFhlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5OYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaGEmJnRoaXMuaGEubGVuZ3RoJiYwPHRoaXMuaGEubGVuZ3RoJiYoYT10aGlzLmhhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsCiIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxZZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLlhlKGIpO3JldHVybiBhfSxabDpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LENkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFbdGhpcy54Zl19LFNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DZCgpLGE9dGhpcy5FZigobmV3IERhdGUpLmdldFRpbWUoKSsKIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sR2g6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sJG06ZnVuY3Rpb24oYixhKXt2YXIgZD1lLmFhKGIpLGY9IiIsZj0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxCPTA7QjxoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy5HaChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pOwpoPVtdO2ZvcihsIGluIGYpaC5wdXNoKGwrIj0iK2ZbbF0pO2Y9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZj10aGlzLkdoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYW46ZnVuY3Rpb24oYil7dGhpcy5iYyYmKGIrPXRoaXMuYmMpO2lmKHRoaXMubGIpZm9yKHZhciBhIGluIHRoaXMubGIpdGhpcy5sYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5sYlthXSkpO3RoaXMuYWMmJihiPXRoaXMuJG0oYix0aGlzLmFjKSk7cmV0dXJuIGJ9LG1sOmZ1bmN0aW9uKCl7dGhpcy55YSYmdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLmhsKHRoaXMueWEuY2xpZW50QVBJcyl9LGhsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmCmEuYm8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmFvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZixjLGUpe209dGhpczt0aGlzLlplPSEwO3RoaXMuTGM9Yjt0aGlzLnFhPWE7dGhpcy50Zj1kO3RoaXMuJGQ9Zjt0aGlzLmdjPWM7dGhpcy55YT1lfHx7fTt0aGlzLm1sKCk7dGhpcy5RbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLk9tKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkRjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuRGMoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sdWI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxRbTpmdW5jdGlvbigpe3RoaXMuSmEobmV3IEModGhpcy5MYyt0aGlzLnRlKCJnbG9iYWwiKSksdGhpcy5sbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy56ZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkRjKCl9LmJpbmQodGhpcyksITApfSxPbTpmdW5jdGlvbigpe3RoaXMuSmEobmV3IEModGhpcy5xYSt0aGlzLnRlKCJjbGllbnQiLC0xIT10aGlzLnFhLmluZGV4T2YoIj8iKSkpLHRoaXMuRGMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuemYoImNsaWVudCIpO3RoaXMuc2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LHRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ7ZD0oYT8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5PYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYKKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5tZCl7dGhpcy5tZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZyl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTsKZm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5nYz0hMSk7ImZvY3VzLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuZ2M9ITEpO3RoaXMuZ2MmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5nYz90aGlzLmdjKCk6KGEoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYSw1MDApKTt0aGlzLlM9dGhpcy5VZT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy5lZSkpO3RoaXMuV2IoKTtlLkhjKGsucW4pOyhhPWUuVWEodGhpcy5DZCgpKSl8fChhPWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpOwpifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxsbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZj0hMTt0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGY9ITApfWNhdGNoKGgpe31pZighKGZ8fGEuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUmJ8fAp0aGlzLkFhfHx0aGlzLkRjKCk6KHRoaXMuSWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy5XYigpKX19LERjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7dHJ5e3ZhciBjPWUuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihhPSEwKX1jYXRjaChoKXt9Yz1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8ZC5zZXJ2ZXIubGVuZ3RoO2IrKyl7dmFyIGE9ZC5zZXJ2ZXJbYl07dHJ5e3ZhciBnOyhnPXZvaWQgMD09PWEpfHwoZz0hYS5yZXBsYWNlKCJbaGFzaF0iLHRoaXMuRWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSkpO2lmKGcpcmV0dXJuITF9Y2F0Y2goZil7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmhhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5oYS5sZW5ndGg7YisrKXRoaXMuaGFbYl09dGhpcy5oYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuSCgid2ViLmRlIil8fGUuSCgiZ214Lm5ldCIpfHxlLkgoImdteC5hdCIpfHwKZS5IKCJnbXguY2giKXx8ZS5IKCIxdW5kMS5kZSIpKSYmIXRoaXMuTmMoKSlmb3IoYj0wO2I8dGhpcy5oYS5sZW5ndGg7YisrKXRoaXMuaGFbYl09dGhpcy5oYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5kZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5SYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuUWU9ZC5hZHBhdGh8fCIiO3RoaXMueGY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuaGEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5SYiYmdGhpcy5BYSYmdGhpcy5oYS5sZW5ndGg/dGhpcy5PYyghMSk6KHRoaXMuSWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy5XYigpKX0sY2k6ZnVuY3Rpb24oYil7dGhpcy5lZHx8KHRoaXMuZWQ9Ynx8CiIiKX0sT2M6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEModGhpcy5TYygpKSxkPXRoaXMuYWEodGhpcy5SYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQyh0aGlzLlJiK3RoaXMudGUoImN1c3RvbWVyIikpO3RoaXMuSmEoYSx0aGlzLndvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnpmKCJjdXN0b21lciIpO2I/dGhpcy5paz90aGlzLnNhKCJub1NWTUNvbmZpZyIpOih0aGlzLmlrPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5PYyghMCl9LmJpbmQodGhpcyksITApfX0sd286ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9CmIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5sYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubGM9ITA7dGhpcy5PYyghMCk7cmV0dXJufX1hPSExO3RyeXt2YXIgYz1lLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWlmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiYoZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGhpZGUiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFncyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzanMiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc3hociIpKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLlNmPXRoaXMuZ2IoZC5zdHJpY3QpO3RoaXMuWWQ9dGhpcy5nYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7CnRoaXMuUGc9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmFiPXRoaXMuZ2IoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmdiKGQuZW5hYmxlZCk7dGhpcy5TYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlViPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWGM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnFjPWQudGVzdDNwY29va2llfHwiIjt0aGlzLmJjPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMubGI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuYWM9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmtkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLiRlPWQuanNwb3B1cHN8fCExO3RoaXMud2I9ZC5zaWRlbG9hZHN8fCExO3RoaXMuaGI9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLmhiO3RoaXMuR2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5uZD1kLmNhcHRpb25fZHVyYXRpb258fAohMTt0aGlzLlhmPWQudm1hcHN8fCIiO3RoaXMuQmM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmRkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlVkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMubGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmxjPSEwLHRoaXMuT2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuSm8oKSYmKHRoaXMuU2J8fHRoaXMuVWJ8fHRoaXMuVGJ8fHRoaXMuWGMpP3RoaXMudGY/KHRoaXMuSWE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy55ZSgpLHRoaXMuV2IoKSk6dGhpcy56bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLk9mKCkpfX0sem86ZnVuY3Rpb24oKXt0aGlzLnlvKCk7dGhpcy5BbygpfSxBbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5ZKDEwKSxoPWUuWSgxMCksQj1lLlkoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQ2IoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS52ZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLkNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLnNhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxPZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuV2IoKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy51Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5JYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIoYikpLHRoaXMuV2IoKSx0aGlzLnllKCkpfSx5bzpmdW5jdGlvbigpe2lmKHRoaXMuU2Ipe3ZhciBiPWUudmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLkZtKCkpdGhpcy5UZCh0aGlzLlliLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuU2IpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5TYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlRkKHRoaXMuWWIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmxpKCl9fWVsc2UgdGhpcy5saSgpfSxNZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuT2IoKSksCnRoaXMuRG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLkxmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLkxmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlRkKHRoaXMuWWIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5UYj10aGlzLlhjKSYmdGhpcy5UYi5sZW5ndGgpe3ZhciBkPXRoaXMuVGIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5MZigpfSxEbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5KYShuZXcgQyhiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5PYigpKSx0aGlzLkVvKGYsMDxkLmxlbmd0aD9iLmJpbmQodGhpcyk6dGhpcy5NZi5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSl9Y2F0Y2goYyl7dGhpcy5NZigpfX1mdW5jdGlvbiBhKCl7dGhpcy5UZCh0aGlzLlliLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlViJiZ0aGlzLlViLmxlbmd0aCl7dmFyIGQ9dGhpcy5VYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLk1mKCl9LEVvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLnFjKXRyeXtlLkVkKHRoaXMucWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuRGI9IXRoaXMuZ2IoYS5jYyk7dGhpcy5PZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5qaSgpfWVsc2UgdGhpcy5PZigpfSxqaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuV2IoKTt0aGlzLnllKCl9LEZtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LApXYjpmdW5jdGlvbigpe3ZhciBhPSIwIixnPSIwIjt0cnl7ZS5DYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnVjJiYoZz0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitnLCEwKTt0aGlzLnFjJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuRGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLmZlKSk7dGhpcy4kZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLiRkJiZ0aGlzLiRkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkRifSl9LGxsOmZ1bmN0aW9uKCl7aWYodGhpcy5ZZCYmdGhpcy5ubSgpKXt2YXIgYT10aGlzLlhsKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZyl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPQphLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxKYTpmdW5jdGlvbihhLGcsZCxmLGMsaCl7dGhpcy5CZHx8KHRoaXMuQmQ9MCk7dGhpcy5CZCsrO3RoaXMuQmQ+dGhpcy5uaCYmIXRoaXMub2gmJih0aGlzLm9oPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5uaCwhMCkpO2E9bmV3IExhKGEsZyxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtmJiYoYS5FaT0hMCk7YyYmZS5EbSgpJiYoYS5ZZz0hMCk7aCYmKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0saWw6ZnVuY3Rpb24oKXt0aGlzLlltfHwodGhpcy5ZbT0hMCxlLkNhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LApmdW5jdGlvbihhKXt2YXIgZz1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihmPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGZbMF0mJihmPWZbMF0pLGYpe2Y9ZiYmZi5jaGlsZE5vZGVzJiZmLmNoaWxkTm9kZXNbMF0/Zi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLk5jKCl8fChmPXRoaXMuYWEoZiksZj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGQpe31lLm5ldHdvcmtTdGF0ZT09CmUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9ZS5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGcpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpO2UubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LAp4bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5YZn0samw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkphKGEsdGhpcy5Wby5iaW5kKHRoaXMpLHRoaXMuVW8uYmluZCh0aGlzKSl9LFZvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8CnRoaXMuSGwoKX0sVW86ZnVuY3Rpb24oKXt9LEhsOmZ1bmN0aW9uKCl7ZS5IYyhrLkdsKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx5ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMud2IubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy53YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5iYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZmEoKV09dGhpcztlLmJiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEpvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuVWR9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLAphfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxZOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBnPSIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxnYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxDYjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sYWE6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbZ1tmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sRWY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsZT1BcnJheSg4MCksaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZik7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1oO249aztxPWw7cj1tO3U9dDtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZxfH5uJnIpK3UrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7Zm9yKGY9MjA7Mzk+PWY7ZisrKXY9ZChjLDUpKyhuXnFecikrdStlW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1xLHE9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTQwOzU5Pj1mO2YrKyl2PWQoYyw1KSsobiZxfG4mcnxxJnIpK3UrZVtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZj02MDs3OT49ZjtmKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihnKGgpK2coaykrZyhsKStnKG0pK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLnVqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5MaXx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5lYj1hLmMuUigpOnRoaXMuZWI9IiI7YS5jLnZoJiZhLmMudmgoe3BhdXNlOnRoaXMuSGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy4kaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5oZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLlBvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEub2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5oYz10aGlzLmxkPSExO3RoaXMuWGs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9Zzt0aGlzLmliPXt9O3RoaXMudmlkZW89e307dGhpcy5RZD17fTtlLnJiKCJuZXdCaWdBZElkIik7dGhpcy4kaz1lLlkoMTApOwp0aGlzLklmPTA7dGhpcy5oZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmhkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmhkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlVrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUmM9dGhpcy5QZD0hMTt0aGlzLkVoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5zZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMubWM9ITE7dGhpcy53bD1lLlkoMTApO3RoaXMuTmI9ZS5ZKDEwKTt0aGlzLkxiPWUuWSgxMCk7dGhpcy5laT1lLlkoMTApO3RoaXMuY29uZj17fTt0aGlzLmFlPQp0aGlzLlhiPXRoaXMuQ2U9dGhpcy5zZD10aGlzLlJkPXRoaXMueGI9dGhpcy5zYz10aGlzLk5oPXRoaXMuQmU9dGhpcy54ZD10aGlzLktvPXRoaXMuQWI9dGhpcy5NYj0hMTt0aGlzLnhjPVtdO3RoaXMubmM9e307dGhpcy5tbj0yMDA7dGhpcy4kZj10aGlzLlljPXRoaXMuQ2M9dGhpcy5aZj10aGlzLnNmPSExO3RoaXMua2Y9e319Yy5vaj1hO2EucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBnfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMucG8oKTtlLm8oay5Mayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxjZjpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLkFiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLklmKyssZS5yYigibmV3U21hbGxBZElkIiksdGhpcy5BLmxsKCksYz1tLmdldENvbmZpZygpLGUuRGUmJih0aGlzLkEuVW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5JYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5yaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkVoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLnJpKCksCm5ldyBTKHRoaXMsYSx0aGlzLkVoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmhiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB2Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2Yy5jZihhLGcsZCl9LDUwKX19LG9mOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5hZT10aGlzLlhiPXRoaXMuQmU9dGhpcy54ZD0hMTt0aGlzLmI9YTt0aGlzLmpvKHRoaXMuYik7dGhpcy5qaChhKTt0aGlzLnhjPXRoaXMuJGcoYSk7dGhpcy5wbCgpfSxqaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5RZD10aGlzLmhtKGIpKSx0aGlzLmpoKGIucGFyZW50KSl9LCRnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy4kZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLlJsKGIpKSk7cmV0dXJuIGd9LFJsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5MJiZhLkwuZ2V0QXR0cmlidXRlKXtnPWEuTC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxobTpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuTCl7Zz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuTC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEucGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scmE6ZnVuY3Rpb24oYSl7YS5aYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS51ZCYmYS51ZC5lcnJvciYmYS51ZC5lcnJvci5jb2RlJiYoZz1hLnVkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuJGMuY29kZTpnPT1GLmplLmNvZGU/ZS5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZS5kZigpLGc9PUYuZGcuY29kZSYmZS5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7ZS5vKGsuRmwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnFvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuRGImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5EYiwhMCk7YnJlYWs7Y2FzZSB2LmJnLmNvZGU6ZS5vKGsuV28sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmUubyhrLnFwLAp0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5rZS5jb2RlOmUubyhrLnJwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuZ2UuY29kZTplLm8oay5lbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuY2UuY29kZTplLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuYWcuY29kZTplLm8oay5Ubyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLldhKCJ1bmtub3duIil9dGhpcy5pYyhhKTt0aGlzLlFhKCl9LGljOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTmEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5OYS5wb3AoKTt0aGlzLmJmKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxqbzpmdW5jdGlvbihhKXt0aGlzLkNlPSExO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5EZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmliLnpJbmRleD1nO2c9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC56ZCYmKGM9ZC56ZCgpKTtjLnZpZGVvU2xvdCYmKGc9Yy52aWRlb1Nsb3QsdGhpcy5zZj0KITApfWNhdGNoKGgpe31nLnNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5VayYmdGhpcy5wbGF5ZXIuSmUoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkplKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk8ubGVuZ3RoO2QrKylnLmNhblBsYXlUeXBlKGEuT1tkXS50eXBlKSYmCnRoaXMuUGsoZyxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLnNmJiZnLmxvYWQoKTtpZih0aGlzLm1pKGcpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlNrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5zZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuc2woKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXToKYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZyksdGhpcy5obygpKTp0aGlzLmIub3JpZ2luLlJnKHYuZ2UpfSxobzpmdW5jdGlvbigpe3RoaXMuWmY9ITA7dGhpcy54Yj10aGlzLnNjPSExO3RoaXMuYS5jLmthJiZ0aGlzLmEuYy5rYSgpJiYoZS5vKGsuSWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLnhiPSEwKTtlLnplKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm9hJiZlLlRrKHRoaXMuYi5vcmlnaW4ub2EpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5CO3RoaXMuYS5CPUQucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQixhKTt0aGlzLmEuT2goKTt0aGlzLmEuRmYoKTtmb3IoYT10aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYS5GZigpO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5EZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLnhiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuUWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLkRmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5rbSgpLGM9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmYi51cmwmJjA8PWIudXJsLmluZGV4T2YoIndlbGVjdC5qcyIpJiZ0aGlzLkEpe3ZhciBoPXRoaXMuQS5nZXRDb25maWcoKTtoJiZoLmFkRmFsbGJhY2tDb25maWcmJmguYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyYmKGM9SlNPTi5zdHJpbmdpZnkoaC5hZEZhbGxiYWNrQ29uZmlnKSl9dmFyIGs9Cntob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuRCwiY29uZmlnIixrKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsCmspfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUueGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIiwKdGhpcy5BKTt0aGlzLkQuc3JjPWE7ZS51ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlJkJiZ0aGlzLmEuYy51YSgpJiZlLm8oay5FYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5rYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy54Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZXAoKSx0aGlzLmEua2MoITApLCF0aGlzLlhiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSwKdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5YYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5hZT0hMDtlLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5XZSh0aGlzLlhiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEua2MoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmtjKCEwKSx0aGlzLm1wKCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtwKCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmxwKCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubnAoKTsiQWRWaWRlb0NvbXBsZXRlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLm5iKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UubyhrLkhnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5CY3x8dGhpcy5ZYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChkKXt3aW5kb3cub3BlbihoLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ocCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT0KYS5kYXRhLm5hbWUmJmUubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlljJiYodGhpcy4kZj0hMSx0aGlzLnBjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy54Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUWIoIm11dGVkIiwidXNlciIpLGUubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLnhiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5RYigidW5tdXRlZCIsCiJ1c2VyIiksZS5vKGsuUWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZS5vKGsucWUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtlLnVlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcykpO2UudWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEudWcoZnVuY3Rpb24oYSl7ZS5sYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMudHJhY2soInBhdXNlIik7ZS5vKGsub2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuc2M9ITB9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7CmEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5zYz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLmdpKCk7ZS5vKGsubGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sbXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWGEoInN0YXJ0Iik7ZS5vKGsuZmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sCmtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMueGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2UubyhrLm5nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtlLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMuVWYoKTt0aGlzLlhhKCJjb21wbGV0ZSIpfSxDaTpmdW5jdGlvbihhKXtpZih0aGlzLkQmJnRoaXMuRC5wYXJlbnROb2RlJiZ0aGlzLkQucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLldhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgZz0KdGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtnLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZyk7ZS56ZSgpO3RoaXMuRD0hMTt0aGlzLlFhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGc9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZyYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZz1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZy5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2UubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LFBrOmZ1bmN0aW9uKGEsZyl7ZnVuY3Rpb24gZChhLGIpe2lmKGIuSWEmJmIuaXNFbmFibGVkJiYhYi5OYygpKXt2YXIgZD1iLmFhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKYy5zcmM9ZChnLHRoaXMuQSk7Yy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChnLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sU2s6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5XZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5VZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlZmLmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5XZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5VZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlZmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGN8fHRoaXMuV2YoYSl9LmJpbmQodGhpcyksdGhpcy5YaykpfSxXZjpmdW5jdGlvbihhKXtpZighdGhpcy5sZCYmdGhpcy5taSh0aGlzLnZpZGVvKSYmIXRoaXMuTWImJiF0aGlzLmhjKXt0aGlzLmxkPSEwO3RyeXtpZighZS5DYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5iLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuTWJ8fCh0aGlzLk1iPSEwLHRoaXMuTGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5QZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUWEoKTtyZXR1cm59fWNhdGNoKGcpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5GZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy55ZygpO3RoaXMuYS5PaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5KZigpfX0sSmY6ZnVuY3Rpb24oKXt0aGlzLnNkfHx0aGlzLmpnKCl9LGpnOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMudmlkZW8ucGxheSgpO2lmKGcmJmdbImNhdGNoIl0pZ1siY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuc2R8fChhP3RoaXMuUWEoKToodGhpcy5oZighMCksdGhpcy5qZyghMCkpKX0uYmluZCh0aGlzKSk7CmNhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5vYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm9jLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm9jLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy5zZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuSmYoKSl9LmJpbmQodGhpcyk7dGhpcy5MZSgpLmRpKHRoaXMpfSxVZjpmdW5jdGlvbigpe3RoaXMuQS5hYiYmIXRoaXMuTWImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTt0aGlzLkJlPSEwO2UubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5RYSgpfSxNazpmdW5jdGlvbihhKXtmb3IodmFyIGc9W10sZD0hMSxjPTA7YzxhLmxlbmd0aDtjKyspZD1lLmVoKGFbY10pLApnLnB1c2goZCk7YT17aGFzaGVzOmd9O2E9ay5TYShhLHRoaXMudSgpKTtlLm5vKGEpfSxRYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5iZSYmdGhpcy5Nayh0aGlzLmIuYmUpO2lmKCF0aGlzLkNlKWlmKHRoaXMuQ2U9ITAsdGhpcy5hZXx8KGUubyhrLmhuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnpifHx0aGlzLmIudmMpe2UucmIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuSWYrKzt0aGlzLmhjPXRoaXMubGQ9ITE7dHJ5e3RoaXMuTGQodGhpcy52aWRlbyl9Y2F0Y2goZyl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5pYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChjKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLlBkPSExO3RyeXt0aGlzLmEudmkoKX1jYXRjaChoKXt9dGhpcy5SZD0hMDt0aGlzLmEuUGUoKTsKdGhpcy5tYz0hMTt0aGlzLkxlKCkuWWgoKTt0aGlzLmIuemImJnRoaXMuYi5vcmlnaW4uamYoKTt0aGlzLmIudmMmJihhP3RoaXMuYi5vcmlnaW4uSGgoKTp0aGlzLnJkKCkpfWVsc2UgdGhpcy5yZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkxkKHRoaXMudmlkZW8pLHRoaXMuVmYoYSkpfSxWZjpmdW5jdGlvbihhKXt0aGlzLmhjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5pbCgpO3RoaXMuYi5vcmlnaW4uUmcodi5nZSl9LEFpOmZ1bmN0aW9uKCl7aWYodGhpcy5Lbyl0aGlzLlFhKCk7ZWxzZXt0aGlzLm1jPQohMDt0aGlzLmEuYy51YSYmIXRoaXMuUmQmJnRoaXMuYS5jLnVhKCkmJmUubyhrLkVjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk5vKGEpO2lmKCF0aGlzLlhiKXt2YXIgZz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuWGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmFlPSEwO2UubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6ZyxwZXJjZW50OmQsCnN0YXJ0VGltZTohMX07ZS5XZSh0aGlzLlhiKX1kPSIiO3RoaXMuYi5IZiYmKGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuSGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuUGR8fCh0aGlzLlBkPSEwLGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLnpiPyh0aGlzLmhjPXRoaXMubGQ9ITEsdGhpcy5MZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLlBkPSExLHRoaXMuYS52aSgpLHRoaXMuYi5vcmlnaW4uamYoKSk6CnRoaXMuUWEoKX0uYmluZCh0aGlzKSkpKSxnLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuaGQucmVwbGFjZSgiW3RpbWVdIixlLlpnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMuc2U9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5OaHx8KHRoaXMuTmg9ITAsdGhpcy54ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE5vOmZ1bmN0aW9uKGEpe2UubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5NYnx8KDA9PWEmJih0aGlzLkFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLkFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5EYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsCmZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5NYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmFiJiZ0aGlzLlhhKCJzdGFydCIpLGUubyhrLmxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZS5vKGsucWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYWImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy54ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmlnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PQpNYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5hYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUubyhrLm5nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYWImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGcpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxnLCEwKX0scG86ZnVuY3Rpb24oKXtlLldkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LApnaTpmdW5jdGlvbigpe2UuV2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scW86ZnVuY3Rpb24oKXtlLldkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7ZS5XZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5aZnx8dGhpcy5BLmFiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFFiOmZ1bmN0aW9uKGEsZyl7dGhpcy5BLmFiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsZywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZyl7aWYoIXRoaXMuTWIpe3RoaXMua2YmJnRoaXMua2YudHJhY2smJnRoaXMua2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLkRlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwKImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5pbSh0aGlzLmIuTmEsYSl9Y2F0Y2goYyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkNjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuUWQuaW1wcmVzc2lvbnMmJmUuQm0oaC51cmwsdGhpcy5RZC5pbXByZXNzaW9ucyk/dGhpcy5iZihoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuUWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5iZihoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZyl0cnl7dGhpcy5iLk5hPXRoaXMuemwodGhpcy5iLk5hLGEpfWNhdGNoKEIpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWUuQ2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYz0iIjt0aGlzLlpmJiYoYz0iX3ZwYWlkIik7dGhpcy5ZYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxiZjpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQS53YShhKSxkJiZjLk9rKGQpLGZ8fChmPXRoaXMuT2cpLGV8fChlPXRoaXMuT2cpLHRoaXMuUWsoYSksdGhpcy5BLkphKGMsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFFrOmZ1bmN0aW9uKGEpe3RoaXMubmNbYV09Im9wZW4ifSxYaDpmdW5jdGlvbihhKXt0aGlzLm5jW2FdPSJjbG9zZWQifSxwbDpmdW5jdGlvbigpe3RoaXMubmM9Cnt9fSxzbzpmdW5jdGlvbigpe3ZhciBhPTAsYztmb3IoYyBpbiB0aGlzLm5jKXRoaXMubmMuaGFzT3duUHJvcGVydHkoYykmJiJvcGVuIj09dGhpcy5uY1tjXSYmYSsrO3JldHVybiBhfSxpbTpmdW5jdGlvbihhLGMpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1jfSl9LHpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS50ZyYmYS50Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZS5DYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5wYygpO2Vsc2UgaWYodGhpcy5iLm5iKXt0cnl7dmFyIGE9KG5ldyBEYXRlKS5nZXRUaW1lKCk7CnRoaXMuYi5BZXx8KHRoaXMuYi5BZT0xKTtpZigxMDA+YS10aGlzLmIuQWUpcmV0dXJuO3RoaXMuYi5BZT1hfWNhdGNoKGMpe31lLm8oay5IZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuQmN8fHRoaXMuWWMpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIubmJ9Y2F0Y2goYyl7YT13aW5kb3cub3Blbih0aGlzLmIubmIsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5uYiwiX3RvcCIpfWNhdGNoKGcpe3dpbmRvdy5vcGVuKHRoaXMuYi5uYiwiX3RvcCIpfX19LmJpbmQodGhpcyksNTAwKX19LFhvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmhkLnJlcGxhY2UoIlt0aW1lXSIsZS5aZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5BLm5kJiYoYz10aGlzLkEubmQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmIuYmluZCh0aGlzKSwKMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sRmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5uZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sTmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5uZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFlLktmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy53bDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYygpO3RoaXMuTmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IiwKZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYygpO3RoaXMuTmQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOgooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkxiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkxvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucGMoKTt0aGlzLk5kKCl9LmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLmVpO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuSGYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuQ2EoKXx8Cih0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnBjKCk7dGhpcy5OZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLApkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS51ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLklnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5oZigpKTt0aGlzLkdiKCl9fSxHYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHBjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLiRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5mZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLm9lLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLnNjPyhlLmxhKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuc2M9ITEpOihlLmxhKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5zYz0hMCl9LEhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsub2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5mZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlFiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLlFmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUWIoIm11dGVkIiwidXNlciIpLGUubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxNbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpOwp0aGlzLnhiPyhlLmxhKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMueGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMueGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0saGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5RYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuRmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFBvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlFiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLlFmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxvYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLm9jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm9jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5vYyk7dGhpcy5zZHx8dGhpcy5zZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuSmYoKSl9LHJkOmZ1bmN0aW9uKCl7dGhpcy5LbSgpJiZ0aGlzLkptKCkmJih0aGlzLkEudWN8fCJzcGllZ2VsLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuSmImJnRoaXMuT28oKXx8KHRoaXMuc2Q9ITAsdGhpcy5BYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5BYj0hMSksdGhpcy5KZygpKX0sS206ZnVuY3Rpb24oKXt2YXIgYT1lLnZkKCk7aWYoIXRoaXMuQS5oYnx8ZS5DYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGM9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuQ2EoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsYytkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LEptOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuUmN8fChhPQohMCxjLmFkRmFsbGJhY2tVUkx8fChjLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkNjJiZjLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5SY3x8ZS50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuQ2M/ImFueSI6IiIpKyhjLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5SYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuQ2MmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlJjfSxZbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sT286ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgYz1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoYy5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmMuYXZhaWxhYmxlKXtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgZz1lLnhnKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoZylyZXR1cm4gdGhpcy5jZihnLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy5yZCgpfXZhciBjPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuWWwoKTt0aGlzLkNjPXRoaXMuUmM9dGhpcy5ZYz10aGlzLiRmPSEwO3JldHVybiBjPyhlLmJiKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2MsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LEpnOmZ1bmN0aW9uKGEpe3RoaXMuc28oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpnKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5tbik6KHRoaXMuUmQ9ITAsdGhpcy5hLlBlKCksdGhpcy5hLlJuKCksdGhpcy5tYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkJlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGUubyhrLnZsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5MZSgpLlloKCkpfSxMZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEoIm1pblZpcyIpO2EmJihlLlZlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuSGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5uYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi56Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy54YyYmMDx0aGlzLnhjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy54YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy4kaysiLSIrdGhpcy5JZjt0aGlzLmImJnRoaXMuYi5maCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZmgoKSk7cmV0dXJuIGF9LE9nOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5vanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5Hb3x8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubmE9bnVsbDt0aGlzLlc9W107dGhpcy5MPW51bGw7dGhpcy53Yz10aGlzLnljPSExO3RoaXMub2E9IiI7dGhpcy5ZZj0hMTt0aGlzLnFoPSIiO2QmJmQuZW1wdHk/dGhpcy5UbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLnNrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnZkKCksYjtiPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOm0ud2EobS5TZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihlLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuSCgiZmFuZG9tLmNvbSIpfHxlLkgoImdpZ2EuZGUiKXx8ZS5IKCJraW5vLmRlIil8fGUuSCgic3BpZWxldGlwcHMuZGUiKXx8ZS5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8ZygpKXt2YXIgaD1lLkxnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGc9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxsPWZ1bmN0aW9uKCl7cmV0dXJuKGUuSCgiZ2lnYS5kZSIpfHxlLkgoImtpbm8uZGUiKXx8ZS5IKCJzcGllbGV0aXBwcy5kZSIpfHxlLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZygpfHxrKCl8fGwoKXx8ImFwcHNwb3QiPT1jKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLlNkKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLlNkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZS50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bS53YShtLlNkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5KYShiLHRoaXMuU20uYmluZCh0aGlzKSx0aGlzLlBtLmJpbmQodGhpcykpfSxhaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5uYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkpiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5KYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuSmJ8fHRoaXMuSG0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0ueG8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSG06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxTbTpmdW5jdGlvbihhKXt0aGlzLnpuKGEpO3RyeXt0aGlzLm5hPWEucmVzcG9uc2VYTUwsdGhpcy5uYXx8KHRoaXMubmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2LmtlKSl9dGhpcy5XPXRoaXMuYWgoKTt0aGlzLnljPXRoaXMuTmYoKTt0aGlzLndjPXRoaXMua2koKTt0aGlzLnFoPWEudXJsQ2FsbGVkO2lmKHRoaXMuVy5sZW5ndGgpdGhpcy5RYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlJhKHYuJGMse2Vycm9yOnRoaXMuWWY/Ri5qZTpGLmNnfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuVWEodGhpcy5vYSksITApfWNhdGNoKGMpe319fSxUbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5uYXx8Cih0aGlzLm5hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2LmtlKSl9dGhpcy5XPXRoaXMuYWgoKTt0aGlzLnljPXRoaXMuTmYoKTt0aGlzLndjPXRoaXMua2koKTt0aGlzLlcubGVuZ3RoP3RoaXMuUWMoKTp0aGlzLnJhKHRoaXMuUmEodi4kYyx7ZXJyb3I6dGhpcy5ZZj9GLmplOkYuY2d9KSl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlJhKHYuYmcse2RlcHRoOmJ9KSl9LFFjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuVy5zaGlmdCgpO3RoaXMuTG0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMua2goKSxnLHtBZFN5c3RlbTp0aGlzLlFsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMub2YodGhpcy55bCgpKSl9LGpmOmZ1bmN0aW9uKCl7dGhpcy55Yz8odGhpcy55Yz0xPHRoaXMuVy5sZW5ndGgsCnRoaXMuVy5sZW5ndGgmJnRoaXMuUWMoKSk6dGhpcy5wYXJlbnQuamYoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLlFjKCkpOnRoaXMucGFyZW50LkhoKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLkljKCk/dGhpcy5yYSh0aGlzLlJhKHYuY2UpKTp0aGlzLnJhKHRoaXMuUmEodi5hZykpLCExKToodGhpcy5yYSh0aGlzLlJhKHYuJGMsRi5kZykpLCExKX0sb2Y6ZnVuY3Rpb24oYSl7dGhpcy5vYXx8KHRoaXMub2E9IiIpO2EuYmV8fChhLmJlPVtdKTthLmJlLnB1c2godGhpcy5xaCk7YS5OYT1hLk5hLmNvbmNhdCh0aGlzLmVmKCkpO2EuemI9YS56Yj9hLnpiOnRoaXMueWM7YS52Yz1hLnZjP2EudmM6dGhpcy53YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5vYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuWGc7dGhpcy5wYXJlbnQub2YoYSl9LAp5bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5kdXJhdGlvbj10aGlzLkljKCk7YS5PPXRoaXMuaGgoKTthLm5iPXRoaXMuVGwoKTthLnpxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUGwoKTthLkhmPXRoaXMuZ20oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlhnO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlhnO2lmKCF0aGlzLkwmJnRoaXMubmEmJnRoaXMubmEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLkw9dGhpcy5uYTt0cnl7aWYodGhpcy5MJiZ0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5OYT1hLmVycm9yLmNvZGUhPXYuY2UuY29kZT9hLk5hLmNvbmNhdCh0aGlzLlVsKCkpOmEuTmEuY29uY2F0KHRoaXMuY20oKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5pYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmljJiZ0aGlzLnBhcmVudC5pYyhhKSxiPTAsdGhpcy5RYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGljOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmljKGEpfSxSZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaGgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5JYygpfSxOZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5OZigpJiYoYT0hMCk7cmV0dXJuIGF9LHpuOmZ1bmN0aW9uKGEpe3RoaXMub2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5vYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm9hPSJVTktOT1dOIn10cnl7dGhpcy5ZZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMbTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmtoKCkubGVuZ3RofSxraDpmdW5jdGlvbigpe3JldHVybiB0aGlzLktlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFFsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2UodGhpcy5MLCJBZFN5c3RlbSIpfSxlZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnhoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnBiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMueGgoYS5wYXJlbnROb2RlKTohMX0sY206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sVWw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUGE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxVcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5wYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5QYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5QYSktTWF0aC5hYnMoZC1iLlBhKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxQbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5BZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sSWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5wYih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGdtOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUubW8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sS2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnBiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxOZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0scGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5BZChhKToiIn0sQWQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5OZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuc2t8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5Wa3x8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5PPVtdO3RoaXMubmI9IiI7dGhpcy5zPXRoaXMudmM9dGhpcy56Yj0hMTt0aGlzLlJlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5TZT0iIn1jLllqPWE7YS5wcm90b3R5cGU9e3NsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTy5sZW5ndGg7YysrKWlmKDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGFtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5uYSl7dmFyIGE9dGhpcy5vcmlnaW4ubmE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5SZT1hW2RdKX1yZXR1cm4gdGhpcy5SZX0sCmZoOmZ1bmN0aW9uKCl7aWYodGhpcy5TZSlyZXR1cm4gdGhpcy5TZTt2YXIgYT0iIjsoYT10aGlzLmFtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5TZT1hfSxrbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk8ubGVuZ3RoO2MrKylpZigwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuWWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuc3B8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtrZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixNYToiWE1MX1BBUlNFX0VSUk9SIn0sYWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixNYToiRFVSQVRJT05fRVJST1IifSwkYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTWE6IkVNUFRZX1ZBU1QifSxlZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixNYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sYmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk1hOiJMT0FEX0VSUk9SIn0sZ2U6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE1hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTWE6Ik1FRElBRklMRV9FUlJPUiJ9LGNlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE1hOiJEVU1NWV9BRCJ9fSxGPXtjZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE1hOiJOT19BRFMifSxkZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTWE6Ik5PX01FRElBRklMRVMifSx2cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixNYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLnhrfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnVkPWM7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLmRqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5Xa3x8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1jO3RoaXMuWmQ9W107dGhpcy5XaD1bXTt0aGlzLmxmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLndwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5aaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5vcT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Gbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlpkLnB1c2goe3NyYzpkLGZyYW1lOmgsbm46ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMubGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5sZltjXTtkLnR5cGU9PT1hJiZkLmNsKHRoaXMuVmwoYSkpfX0sVmw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7eHE6ITAsd3E6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7bHE6InZpZGVvIixBcToianNDdXN0b20iLEJxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQ3E6MSxWcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxqbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuWmQubGVuZ3RoO2MrKylpZih0aGlzLlpkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuWmRbY10ubm47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsYyl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5qbShjKSx2ZW5kb3I6Y30pO3RoaXMub28oKX0sRm46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnZnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMudmcoYSxjKX0sdmc6ZnVuY3Rpb24oYSxjKXt0aGlzLmxmLnB1c2goe3R5cGU6YSwKY2w6Yyx1cTohMX0pfSxvbzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuRW18fChhLm5xKHthZFNlc3Npb25JZDplLlkoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnlxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5FbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLm5rfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLm9iPWEuYmgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlkoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk9hPXt9O3RoaXMud2c9ITE7dGhpcy5kYz1bXX1jLmJqPWE7YS5wcm90b3R5cGU9e09sOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuT2woYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLnJtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSx2bzpmdW5jdGlvbigpe3RoaXMud2c9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5FYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLndnfHwodGhpcy5jLnBsYXkoKSxlLm8oay5xZCx0aGlzLmMubCgpKSl9LEZmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLm9iLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5vYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5vYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLm9iLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMub2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMub2IpO3RoaXMuYy5VYyYmdGhpcy5jLlVjKCk/dGhpcy5jLmJoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0scm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxNbDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGtjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuTWwodGhpcy5vYik7aWYoYy54IT10aGlzLk9hLnh8fGMueSE9dGhpcy5PYS55fHxjLnBvc2l0aW9uIT10aGlzLk9hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk9hLndpZHRofHxjLmhlaWdodCE9dGhpcy5PYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5PYS53aWR0aCYmMDx0aGlzLk9hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuUGUoKTtyZXR1cm59dGhpcy5PYT1jO3RoaXMuYy5VYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmRjLmxlbmd0aDthKyspdGhpcy5kY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLktmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2MuYmluZCh0aGlzKSwxMCl9LHVnOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLmRjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5kYy5wdXNoKGEpfSxQZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5ianx8WWEsRD1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5ZKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMua2p8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuTWQoYSk7dGhpcy5NZygpfSxNZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sTWc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlRhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5UYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLlNqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLiRiPXRoaXMuJGJ8fCExO3RoaXMubWc9dGhpcy5vZz10aGlzLnVoPXRoaXMudmE9dGhpcy5QZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLktsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnVoJiZ0aGlzLkVnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuSWI7YSYmYS5tYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5vZCgpO3RoaXMudWg9ITA7dGhpcy5FZygpfS5iaW5kKHRoaXMpKTt0aGlzLkFnKCl9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3RoaXMub2QoKTtpZighdGhpcy5QZiYmIXRoaXMub2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlBmJiZ0aGlzLm1nJiYhdGhpcy5vZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKX19LG9kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5paCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxpaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sQWc6ZnVuY3Rpb24oKXtpZih0aGlzLm9kKCkpe3ZhciBhPXRoaXMuaWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5vZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLm1nPWEuU3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMDApfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5qcSgpOiExfSxJYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuSWMoKTotMX0sZG06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LEtsOmZ1bmN0aW9uKGEsYil7dGhpcy4kYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLiRifHwzMDI9PXRoaXMuJGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuJGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmlhKCkpOmEuVGUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5kbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Sanx8YmI7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxHbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5iay5Iay5Gaz93aW5kb3cuT08uYmsuSGsuRmsuUXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5NZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLlRqfHxjYixkYj1uZXcgY2IodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5sbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMubG58fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuZ2E9ITE7dGhpcy5saCgpfSxsaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5VKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LExhOmZ1bmN0aW9uKCl7dGhpcy5SaCgpfSxSaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuViYmKDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLlNpfHxmYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5pYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmlhKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkJnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuQmcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLlJpfHxnYjsoZnVuY3Rpb24oYyl7Yy5UaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5NZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5MbHx8KHRoaXMuTGw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYixUPW5ldyBoYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLkRsfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxVYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cuZ2QoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3LmdkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuam4oYSl9LmJpbmQodGhpcykpO3cuZ2QoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5nZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubW0oKX0sam46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5HZCYmKGE9ZS5BbChhLHRoaXMuR2QpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5NKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkYpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkdkfHwodGhpcy5HZD1bXSksdGhpcy5HZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5NKGQpfHwodGhpcy5OKGQpLGY9bmV3IFYoZCx0aGlzLkYpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZ2Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwKKHRoaXMuYmFbYV09e30pO3RoaXMuYmFbYV1bYl18fCh0aGlzLmJhW2FdW2JdPVtdKTt0aGlzLmJhW2FdW2JdLnB1c2goYyl9LEhvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYmF8fHRoaXMuYmEmJiF0aGlzLmJhW2JdKXRoaXMuUGN8fCh0aGlzLlBjPVtdKSx0aGlzLlBjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy52ZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxtbTpmdW5jdGlvbigpe2lmKHRoaXMuUGMpZm9yKHZhciBhPTA7YTx0aGlzLlBjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuUGNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5iYVtjXVtkXSYmMDx0aGlzLmJhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYmFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmJhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5IbyhhKX19KX0pKGMpO3ZhciBqYj1jLm1rfHxqYix3PW5ldyBqYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMudGt8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9pPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuT2l8fGxiOyhmdW5jdGlvbihjKXtjLlBpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLlBpfHxtYjsoZnVuY3Rpb24oYyl7Yy5RaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTShoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRikpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkthKWlmKGI9PXRoaXMuS2FbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuS2FbYS5qYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYixvYj1uZXcgbmIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5janx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5HZz10aGlzLkdjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnFsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFsPSEwKTt2YXIgYj10aGlzLlRnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5HYz1iKTtpZighdGhpcy5HZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5HZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuemQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlUoYik7dGhpcy5Fbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTt0aGlzLmZjLnB1c2goYSl9LHJsOmZ1bmN0aW9uKCl7aWYodGhpcy5mYyYmdGhpcy5mYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdHJ5e3RoaXMuZmNbYV0oKX1jYXRjaChiKXt9fSx6ZDpmdW5jdGlvbigpe2lmKHRoaXMuR2MpcmV0dXJuIHRoaXMuR2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuVGcoYSkpcmV0dXJuIHRoaXMuR2M9YX19LFRnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRW46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLm11dGUmJnRoaXMuZWEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sdmg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy5Qanx8cWI7KGZ1bmN0aW9uKGMpe2MuT2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm1hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS56ZCgpPwp0aGlzLkMoKToodGhpcy5FZXx8KHRoaXMuRWU9MSksdGhpcy5FZSsrLDEwMDx0aGlzLkVlP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuUWo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLk0oYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgc2I9Yy5Ranx8c2IsVz1uZXcgc2IodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVsPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHRiPWMuRWx8fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LExhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuemt8fHViOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEtjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxDbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuaWEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy56Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkNuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuS2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy56Yyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmZiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmZiW2JdJiYzMDMhPXRoaXMuZmJbYl0mJjQwMyE9dGhpcy5mYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuaWEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMueWt8fHZiOyhmdW5jdGlvbihjKXtjLkFrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5NKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuQWt8fHdiLHhiPW5ldyB3Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmFsfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5VKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMucGY9ITF9LExhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnRuKCl9LmJpbmQodGhpcyksNTAwKX0sdG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5WJiZ0aGlzLlYoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMucGYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMucGYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxybzpmdW5jdGlvbigpe3RoaXMucGY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLmdrfHx6YjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMucmM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5yY3x8KHRoaXMucmM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5yY3x8dGhpcy5yYysrLHRoaXMucmM8PXRoaXMuWG0/KHRoaXMucmMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnJvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQWI9Yy5ma3x8QWI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBCYj1jLmhrfHxCYixDYj1uZXcgQmIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRGI9Yy53anx8RGI7bmV3IERiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5WKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuZWt8fEViOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubWEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMudGwoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5FYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuTm0oKTp0aGlzLkRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sdGw6ZnVuY3Rpb24oKXt0aGlzLmtnKCl8fHRoaXMuaSghMCl9LE5tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYigpOyFhLnBhJiZhLlcmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxEZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5pYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LEViOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGgpZm9yKHZhciBhPWMuYWQuRWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTGg9YVtlXSk7cmV0dXJuIHRoaXMuTGh9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5FYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLmRrfHxGYjsoZnVuY3Rpb24oYyl7Yy5hZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGtsOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBGYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmFkLkViKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5rbChhW2JdKTt0aGlzLlAoKX19KTtjLmFkLkViPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobCYmbC5wbGF5ZXJhcGkmJihhPWwucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5hZHx8R2IsSGI9bmV3IEdiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5aaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuWml8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVShiKTp0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxpcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApVYzpmdW5jdGlvbigpe3JldHVybiEwfSxUYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5xZj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnFmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMucWYmJmMhPXRoaXMucWZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGUuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEucHEpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuZ2E/dGhpcy52ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxKYj1jLk1qfHxKYixLYj1uZXcgSmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Jaj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBMYj1jLklqfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlUoYikpOnRoaXMuWCgpKTp0aGlzLlgoKTp0aGlzLlgoKTp0aGlzLlgoKX0sYmk6ZnVuY3Rpb24oKXt9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGduOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE1iPWMubWp8fE1iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMueGUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5tYSgpfS5iaW5kKHRoaXMpKX0seGU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy54ZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgTmI9Yy5sanx8TmI7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuZ2F8fHRoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLm5qfHwKT2IsUGI9bmV3IE9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Jbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFiPWMuSW98fFFiO25ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVShiKSk6dGhpcy5YKCkpOnRoaXMuWCgpfSxiaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxnbjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBSYj1jLlZpfHxSYjsoZnVuY3Rpb24oYyl7Yy5XaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLnhlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmlhKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFNiPWMuV2l8fFNiOyhmdW5jdGlvbihjKXtjLlhpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgYz1uZXcgUmIoYVtiXSk7Yy5nYXx8dGhpcy5NKGMpfHwodGhpcy5OKGMpLHdpbmRvdy5icmlkcGxheWVyPWMsKG5ldyBTYihjLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiLFViPW5ldyBUYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLk5pfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPQpiLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5VKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWCgpfSxYZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sRG46ZnVuY3Rpb24oKXt0aGlzLlpjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWmN8fCh0aGlzLlpjPSEwLHRoaXMuWGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlpjJiYodGhpcy5YZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlpjPSExKSx0aGlzLlhkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHVhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgV2I9Yy5Ea3x8V2I7KGZ1bmN0aW9uKGMpe2MuQ2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sVmg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5lYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmVjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuZWMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLlZoLmJpbmQodGhpcyksMTApfSxlYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSWs9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuaSgpKToodGhpcy5Ja3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuaSgpKX0saGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuZWMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhnLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmgoKTt0aGlzLmhnKCk7dGhpcy5HbigpfSxHbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmVjKGEpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLkFuP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLkFuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuZWMoYSkpfX0pfSkoYyk7dmFyIFhiPWMuQ2t8fFhiOyhmdW5jdGlvbihjKXtjLkVrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFdiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5nYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGEuRG4oKSxhPW5ldyBYYihhLHRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgWWI9Yy5Fa3x8WWIsWmI9bmV3IFliKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMua249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciAkYj1jLmtufHwkYjtuZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5waz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLlBoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLmJuPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5YKCl9ZWxzZSB0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxiaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ibn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuVmQoYSl9LmJpbmQodGhpcykpfSxWZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5QaCYmKHRoaXMuUGg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgTj1jLnBrfHxOOyhmdW5jdGlvbihjKXtjLm9rPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5JZSlpZih0aGlzLktifHwKKHRoaXMuS2I9MCksdGhpcy5LYisrLDE1PHRoaXMuS2Ipe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuZW8oKTp0aGlzLmkoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuaSgpOnRoaXMuaSghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkllPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy50YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLkspLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHRiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLks9YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz0KcS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVmE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5nYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKSk7dGhpcy52ZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGFjPWMucWt8fGFjLGJjPW5ldyBhYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBjYz1jLk1pfHxjYztuZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Haj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLkdqfHxaOyhmdW5jdGlvbihjKXtjLkZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnJoPTA7dGhpcy5LPXRoaXMuS3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuTWM9dGhpcy5CYT10aGlzLmpkPSExO3RoaXMuVGg9ZS5PYigxMCk7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5wYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnZiKCksITA7dGhpcy5yaCsrO2lmKDEwPHRoaXMucmgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuaSghMCk6dGhpcy5pKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy56aC5iaW5kKHRoaXMpLDEwMCksITF9LHZiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmIoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnZhPQohMH0sY2E6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCk/KHRoaXMudygpLHRoaXMuaWEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Ganx8YWE7KGZ1bmN0aW9uKGMpe2MuSGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLAp0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5Ianx8ZGMsZWM9bmV3IGRjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMucmt8fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLApiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlUoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5YKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGdjPWMuaWp8fGdjOyhmdW5jdGlvbihjKXtjLmhqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLkNnKCl9LENnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgaGM9Yy5oanx8CmhjOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBnYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5nYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLk0oYSkpe3RoaXMuTihhKTsobmV3IGhjKGEsdGhpcy5GKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgaWM9Yy5qanx8aWMsamM9bmV3IGljKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMudW18fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5HaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5VKGEpOnRoaXMuWCgpKTp0aGlzLlgoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGxjPWMuR2l8fGxjOyhmdW5jdGlvbihjKXtjLkZpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLndlKCk7dGhpcy56ZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSx0YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxEYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LHpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChhPWEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmEuYWRzTG9hZGVyKWZvcih2YXIgYj0wO2I8YS5hZHNMb2FkZXIubGVuZ3RoO2IrKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMuaWEoKSk6dGhpcy5pKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy56Zy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLndlLmJpbmQodGhpcyksMTAwKX0sd2U6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuaSgpOnRoaXMuaSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy53ZS5iaW5kKHRoaXMpLDEwMCl9fSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWEuYmluZCh0aGlzKSwxRTQpO3RoaXMuQyhhKX19KX0pKGMpO3ZhciBtYz1jLkZpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFNhOmZ1bmN0aW9uKGEpe2E9Cm5ldyBsYyhhKTthLmdhP3RoaXMuUCgpOnRoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IG1jKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlNhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5TYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBuYz1jLkhpfHxuYyxvYz1uZXcgbmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGM9Yy5DbHx8cGM7bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkFoPXRoaXMuQ2g9dGhpcy5CaD0hMTt0aGlzLklkPVtdO3RoaXMudWY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHc/bnVsbDp3LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBaYj9udWxsOlpiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLEJyaWRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWI/bnVsbDpVYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEphP251bGw6SmEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9jP251bGw6b2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLiRqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuZW0oYSk6W10sYzt0aGlzLkNoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkJoPQohMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sdGhpcy5haShjKX1lbHNlIGZvcihkIGluIHRoaXMudWYpe2lmKHRoaXMuQWgpYnJlYWs7Yz10aGlzLnVmW2RdO3RoaXMuVGYoYykmJih0aGlzLklkLnB1c2goYyksdGhpcy5haShjKSl9fSxUZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHE/ITA6ITF9LGVtOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYztmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkPWFbZV0sZD10aGlzLnVmW2RdLHRoaXMuVGYoZCkmJmMucHVzaChkKTtyZXR1cm4gY30sYWk6ZnVuY3Rpb24oYSl7dGhpcy5UZihhKSYmYS5mKCl9LHRvOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiByJiYhdGhpcy5CaClmb3IodGhpcy5BaD0hMCxhPTA7YTx0aGlzLklkLmxlbmd0aDthKyspdGhpcy5JZFthXS5WYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLklkW2FdLlZiKX19fSkoYyk7dmFyIHFjPQpjLiRqfHxxYyxMPW5ldyBxYztMLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYz1jLlZtfHxyYztuZXcgcmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGE9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1hLmluZGV4T2YoImhvbWFkIil8fC0xIT1hLmluZGV4T2YoImhkLW1haW4iKSlhPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWEuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1hLnN1YnN0cmluZyhhLmluZGV4T2YoIjoiKSsxLGEuaW5kZXhPZigiaXMgbm90IiktCjEpLGUuSGMoay5SbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuSGMoay5mbiksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciB3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHVjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLGw9ITE7SC5mYSgpO0gud2goKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmZhKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC53aCgpLApmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtILmZhKCk7dmFyIHhjPXdjKGZ1bmN0aW9uKCl7ZS5XZyh3aW5kb3csSC53bSgpLHtpZDp4Y30pfSw1MDApLGlhPWUuWSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBzYz1jLkVqfHxzYztuZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUWg9dGhpcy5jb25mPXRoaXMuSGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkRkPTA7dGhpcy5lYj0iIjt0aGlzLkpkPVtdO3RoaXMuS2Q9MDt0aGlzLlNoPSExO3RoaXMucmY9W107ZS5yYigibmV3QWRkZWxpdmVyeSIpfWMuSWk9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5RaD1hfSxCZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYTt0aGlzLmViPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxXbjpmdW5jdGlvbihhKXt0aGlzLkhiPWF9LFZuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGN9LFZjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLnhtKCkpdGhpcy5IYi5nKHRoaXMuSGIuTGMsdGhpcy5IYi5xYSx0aGlzLkhiLnRmLGZ1bmN0aW9uKCl7dGhpcy5WYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuSGIuZ2MpO2Vsc2UgaWYodGhpcy5vbSgpKXRoaXMuU24oZnVuY3Rpb24oKXt0aGlzLlZjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5FYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPQpuZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLnZvKCk7bC5leGl0RnVsbHNjcmVlbigpO2UucmIoIm5ld0hvbWFkRGlzcGxheSIpO1E9bD1uZXcgUGEobCx0aGlzLkhiLGgpO2wuVG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLldtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWYmJihkPXRoaXMucGxheWVyLmFmKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLmNmKGEsZCxmKTt0aGlzLnBsYXllci5kaShsKX19LHhtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuRGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktCnRoaXMuRGQuZ2V0VGltZSgpLHRoaXMuRGQ9YSwzRTU8Yz8hMDohMTt0aGlzLkRkPWE7cmV0dXJuITF9LGxvOmZ1bmN0aW9uKCl7ZS5yYigicHJlcm9sbCIpO2UuQWYoInByZXJvbGwiKTt2YXIgYT10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkhhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5TZyhhKSk/dGhpcy5WYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLnFkLHRoaXMucGxheWVyLmwoKSkpfSxrbzpmdW5jdGlvbihhKXtpZighdGhpcy5RaCl7ZS5BZigicG9zdHJvbGwiKTtlLnJiKCJwb3N0cm9sbCIpO3RoaXMuJG4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkhhKCJwb3N0cm9sbEFkVGFnIikpOwooZD10aGlzLlNnKGQpKT90aGlzLlZjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnFkLHRoaXMucGxheWVyLmwoKSkpfX0sU2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LEpuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuaW8odGhpcy5rby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5MYSgpfSxPZDpmdW5jdGlvbihhKXtlLnJiKCJtaWRyb2xsIik7ZS5BZigibWlkcm9sbCIpO2lmKCF0aGlzLkZoKXt0aGlzLkZoPSEwO3ZhciBjPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSGEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlZjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLm8oay5xZCx0aGlzLnBsYXllci5sKCkpKX19LEluOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuWm4odGhpcy5PZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5mZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5sbygpO3RoaXMucGxheWVyLmZmJiZ0aGlzLkluKCk7dGhpcy5KbigpfSxLbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkpkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy50cChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLktkPXRoaXMuSmQubGVuZ3RofSxvbTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5LZCYmKGE9ITApO3JldHVybiBhfSxTbjpmdW5jdGlvbihhKXt0aGlzLlNoPWE7Zm9yKGE9MDthPHRoaXMuSmQubGVuZ3RoO2ErKyl0aGlzLkpkW2FdWyJmdW5jdGlvbiJdKHRoaXMueG4uYmluZCh0aGlzKSl9LHhuOmZ1bmN0aW9uKGEpe3RoaXMuS2QtLTthJiZ0aGlzLnJmLnB1c2goYSk7MD49dGhpcy5LZCYmdGhpcy5TaCgpfSxXbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5yZi5sZW5ndGg7ZCsrKWM9dGhpcy5yZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5JaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLllpfHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGt1aVNoaXNoV3VzaG9kb28sa3VpU2hpc2hXdXNob2Rvbyk7Cg==
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
109.71.25.30
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 7103
|
754 B
1 KB
|
21ms
21ms
|
XHR
application/json |
143.204.213.75
AMAZON-02
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=5919259265
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGt1aVNoaXNoV3VzaG9kb289a3VpU2hpc2hXdXNob2Rvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cubWZ8fCh3Lm1mPTApO3cubWYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5tZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZighbCl1YyhlYSw1MCk7ZWxzZSBpZighZS5wbil7bC5wYXVzZUJ1dHRvbnx8KGwucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLm11dGVCdXR0b258fChsLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbC5za2lwYWJsZUJ1dHRvbnx8KGwuc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTtsLnNraXBCdXR0b258fChsLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobC5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtsLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxtKX0pfW0uZyhsLmdsb2JhbENvbmZpZyxsLmNsaWVudENvbmZpZyxsLnByZWNoZWNrZWQsbC5vblJlYWR5LGwub25GYWlsdXJlLGwpO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPWwuc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHQoYyxhKXtpZihlLmJsKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkVjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP20uSWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZmE7Yi5CZihjKTtiLlduKG0pO2IuVm4obCk7Yi5LbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKG0ud2IubGVuZ3RoKXt2YXIgYj1tLndiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGc7Zz1lLmNvKHsiW0xPQURTQ1JJUFRdIjplLlkoMTApLCJbVVRJTFNdIjplLlkoMTApLCJbQ0FMTEJBQ0tdIjplLlkoMTApfSk7d2luZG93W2dbIltMT0FEU0NSSVBUXSJdXT1lLkRoLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBnIGluIGIpbFtnXT1iW2ddO3QoYyxhKX07Zz1iLnNjcmlwdHMuc2hpZnQoKTspZS5EaChnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxtKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmNrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5ibD0hMTt0aGlzLkpiPSJzZXR1cCI7dGhpcy5XYz1bXTt0aGlzLnplKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMud24uYmluZCh0aGlzKSk7dGhpcy5xYj17fTt0aGlzLnBoPXt9O3RoaXMueWY9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt1bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5xYlthXSsiXyIpO3JldHVybiBifSxqYzpmdW5jdGlvbigpe3RoaXMueWZ8fCh0aGlzLnlmPWUuWSgxMCkpO3JldHVybiB0aGlzLnlmfSxyYjpmdW5jdGlvbihiKXt0aGlzLnFiW2JdfHwodGhpcy5xYltiXT0wKTt0aGlzLnFiW2JdKz0xOzU8dGhpcy5xYltiXSYmIXRoaXMucGhbYl0mJih0aGlzLnBoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudW8oKSwhMCkpfSx6ZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFRrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGxhOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSx3bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy52bihiLmRhdGEpfSx2bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx1ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LExnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmVoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5FZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGVoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFJrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUuTmwoYikpcmV0dXJuOyhhPXRoaXMuTGcoYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE5sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxWZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sSW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sTWU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZGg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LGZvOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sRGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy54bChhKSxmPTA7ZjxkLmxlbmd0aDtmKyspdGhpcy5mbyhiLGRbZl0ua2V5LGRbZl0udmFsdWUpfSxkbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0seGw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9mPWNbMV0udHJpbSgpOmY9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLmRsKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpmfTthLnB1c2goZCl9cmV0dXJuIGF9LEtmOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHloOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFZlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxmPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2Y9aC5oZWlnaHQ7MD5oLnRvcCYmKGYrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZik7Yz49YSYmKGU9ITApO3JldHVybiBlfSxXZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlZlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldlKGIpfS5iaW5kKHRoaXMpLDEwMCl9LE9iOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxPZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZjtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylmPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2YsYXw9MDtyZXR1cm4gYX0sRWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWI+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBmLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx4PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1iLmNoYXJDb2RlQXQoZik8PDI0fGIuY2hhckNvZGVBdChmKzEpPDwxNnxiLmNoYXJDb2RlQXQoZisyKTw8OHxiLmNoYXJDb2RlQXQoZiszKSxyLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZik7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cltiKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWg7bD14O3k9azt0PW07Zm9yKGY9MDsxOT49ZjtmKyspcT1kKHAsNSkrKG4mbHx+biZ5KSt0K2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7Zm9yKGY9MjA7Mzk+PWY7ZisrKXE9ZChwLDUpKyhuXmxeeSkrdCtjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1sLGw9ZChuLDMwKSxuPXAscD1xO2ZvcihmPTQwOzU5Pj1mO2YrKylxPWQocCw1KSsobiZsfG4meXxsJnkpK3QrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bCxsPWQobiwzMCksbj1wLHA9cTtmb3IoZj02MDs3OT49ZjtmKyspcT1kKHAsNSkrKG5ebF55KSt0K2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3g9eCtsJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeCkrYShrKSthKG0pKS50b0xvd2VyQ2FzZSgpfSxDYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxmLHAsYyxlLGgseD0wO3g8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHgrKyksZj1iLmNoYXJDb2RlQXQoeCsrKSxwPWIuY2hhckNvZGVBdCh4KyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZik/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx2ZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGg9ITEseD0hMSxrPSExLGw9ITE7dHJ5e2E9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuZGM/ITA6ITF9Y2F0Y2godCl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSx4PSFoJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0oa3x8cCkmJiEhd2luZG93LkNTU31jYXRjaChxKXt9Yi5pc1BoYW50b21KUz1hO2IuaXNDaHJvbWVIZWFkbGVzcz1kO2IuaXNGaXJlZm94SGVhZGxlc3M9ZjtiLmlzT3BlcmE9cDtiLmlzRmlyZWZveD1jO2IuaXNTYWZhcmk9ZTtiLmlzSUU9aDtiLmlzRWRnZT14O2IuaXNDaHJvbWU9aztiLmlzQmxpbms9bDtyZXR1cm4gYn0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj17S2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCnNtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LFVqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxKajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LGprOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sWWs6ZnVuY3Rpb24oKXtyZXR1cm4gYi5LaSgpfHxiLlVpKCl8fGIuc20oKXx8Yi5VaigpfHxiLkJrKCl8fGIuSmooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuWWsoKX0sU2w6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGY9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZlsxXSkpcmV0dXJuIGQ9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhhKXx8W10sIklFICIrKGRbMV18fCIiKTtpZigiQ2hyb21lIj09PWZbMV0mJihkPWEubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1kKSlyZXR1cm4gZC5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtpZighYilyZXR1cm4gZlsxXTtmPWZbMl0/W2ZbMV0sZlsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShkPWEubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZi5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBmLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFthW2ZdXT1iW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxnKXthJiYoZC5xdWVyeUtleVthXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZj0wLHA9Yi5sZW5ndGg7ZjxwOysrZilhLmhhc093blByb3BlcnR5KGJbZl0pfHwoZC5wdXNoKGJbZl0pLGFbYltmXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sZm06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxmLnB1c2goYltwXSk7cmV0dXJuIGZ9LG1vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZj0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhmPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmYpOihkPWIuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LFpnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEFmOmZ1bmN0aW9uKGIpe3RoaXMuSmI9Yn0sV2c6ZnVuY3Rpb24oYixhLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5KYjt0aGlzLnJlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsCmQpKSxiLmRpc3BhdGNoRXZlbnQoZil9Y2F0Y2gocCl7dGhpcy5wbj0hMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEhjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5XZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHo9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih6PWsuU2EoYixhKSk7ZiYmKHo9ay5TYSh6LGYpKTtwJiYoej1rLlNhKHoscCkpO2MmJih6PWsuU2EoeixjKSk7aCYmKHo9ay5TYSh6LGMpKTtlLkhjKHopfSx5bjpmdW5jdGlvbihiKXt2YXIgYT17fTsKaWYoIWIuY29kZSlyZXR1cm4hMTtpZihiLnNwZWNpYWxfdHJhY2t8fGIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmZtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPQpiLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LG5vOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5qYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMucmUoYil9LHJlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMueW4oYik7aWYoYSlpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uU2MoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjsKYi5kYXRhLmhvbWFkX2F0PWE7bS5KYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGY9bS5TYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5KYShmLGZ1bmN0aW9uKGQpe3ZhciBmPQohMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxXZDpmdW5jdGlvbihiKXtpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGEsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uU2MoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLkphKGIpfX0sZGY6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uamwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGYoKX0uYmluZCh0aGlzKSwKNTAwKX0sS2U6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnBiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxOZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0scGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5BZChiKToiIn0sQWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5OZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHhnOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5YZShiKXx8dGhpcy5JbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LndmJiZ3aW5kb3cuc2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5WZyhiKSlyZXR1cm4gdGhpcy5WZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQ2IoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPQohMTtkPSExO2Q9dGhpcy5iYihiLGEuQWEsYyxmdW5jdGlvbihiKXtlPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWEuQ2QoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUmsoZSxiKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYixhLGQsZixjLGUsaCx6KXt2YXIgaz1lfHxtO2U9ITA7eiYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWUuZGF0YVt0XT1kW3RdO3JldHVybiBrLkphKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmIoYixhLGQsZixjLGssaCx6KX0uYmluZCh0aGlzKSw1MDApfSxFZDpmdW5jdGlvbihiLGEsZCxmLGMsZSxoKXt2YXIgaz0hMDtoJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIHggaW4gaClkKz0iJiIreCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbeF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUm06ZnVuY3Rpb24oYixhLGQpe3RoaXMuRWQoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuV2MpZm9yKHZhciBjIGluIHRoaXMuV2MpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5XY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuQ2IoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxEaDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkNiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5iYihiLGYuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlJtKGYuQ2QoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LGNvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLldjPWJ9LHRwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5iYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxaazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LEJtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylpZihhW2ZdPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnBqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZW49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuRmw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnFnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmlnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5uZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5yZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSms9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLmxnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuV289e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmRuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkdsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5xcD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnZsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEucWQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5FYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EucGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkxrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5mZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Eub2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EucWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLktrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5obj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkZkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlFmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5JZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuUm89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5mbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLklsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e09lOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZixjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBNYXRoLmFicyhhKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk9hfHwieCIpfSxibTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuT2F8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHlkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy55ZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLnlkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5PZSh0aGlzLmphKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMueWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHdtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHdoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLk9lKHRoaXMuYm0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy55ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnZqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChnW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5nP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy50bXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5LYT17fTt0aGlzLkY9bnVsbDt0aGlzLlRjPTEwMDt0aGlzLlBiPTA7dGhpcy5WYT0xNTA7dGhpcy5WYj0wO3RoaXMuWG4oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlBiPD10aGlzLlZhPyh0aGlzLlBiKyssdGhpcy5WYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlRjKSk6MD50aGlzLlZhJiYodGhpcy5WYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlRjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGI+dGhpcy5WYT8hMDohMX0sdmY6ZnVuY3Rpb24oKXt0aGlzLlBiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuS2FbYS5qYSgpXT0KYTtMJiZMLkNoJiZMLnRvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBlLk1lKHRoaXMuS2EpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLkthKWlmKGI9PXRoaXMuS2FbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuS2FbYS5qYSgpXT8hMDohMX0sQ206ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuS2EpaWYoYS5pZD09dGhpcy5LYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx0cTpmdW5jdGlvbihhKXt0aGlzLkthW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLlpqfHxxOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuVGM9MTA7dGhpcy5QYj0wO3RoaXMuVmE9NTA7dGhpcy5WPW51bGw7dGhpcy5nYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuSWI9IiI7dGhpcy5OZz0hMTt0aGlzLkooKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGc9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZylhLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxMYTpmdW5jdGlvbigpe30saW86ZnVuY3Rpb24oYSl7dGhpcy5WPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVn0sWm46ZnVuY3Rpb24oYSl7dGhpcy5nZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdmfSxmZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuUGI8PXRoaXMuVmEmJih0aGlzLlBiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5UYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sTWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx2cTpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk5rKCk7dGhpcy5NZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxOazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5ZKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFRlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYX0sWDpmdW5jdGlvbigpe3RoaXMuZ2E9ITB9LFVjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxhZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLkliPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5JYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuSWImJihhPSEwKTtyZXR1cm4gYX0scXE6ZnVuY3Rpb24oKXt0aGlzLk5nfHwodGhpcy5OZz0hMCl9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5KaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmZnPSIxIjt0aGlzLmdnPSIyIjt0aGlzLkdrPSIzIjt0aGlzLmJkPTA7dGhpcy5abT0zMDt0aGlzLlpiPVtdO3RoaXMua2I9W107dGhpcy50Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5zZz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuYmQ7dGhpcy5pZD1lLlkoMTApO3RoaXMuQmYoYSk7dGhpcy5ZbihiKX0sZjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxlLmRmKCkpfSxKaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEubWMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmphKCldfHwod2luZG93W2IuZmEoKV1bYS5qYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmphKCldLmluaXRpYXRvcj1lLmpjKCkpO3dpbmRvd1tiLmZhKCldW2EuamEoKV1bZS5qYygpXT93aW5kb3dbYi5mYSgpXVthLmphKCldW2UuamMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmphKCldW2UuamMoKV09MX0sem06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSTt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5qYSgpXSYmd2luZG93W2cuZmEoKV1bYS5qYSgpXS5pbml0aWF0b3IhPWUuamMoKSYmKHRoaXMuQ2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnZtKCk7CmlmKCF0aGlzLnptKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkNmKCk7cmV0dXJufXRoaXMuQ2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxnKTt0aGlzLnBpKCk7dGhpcy5zZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5aYi5wdXNoKGEpLHRoaXMua2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5aYiYmMDx0aGlzLlpiLmxlbmd0aCYmKHRoaXMuWmI9ZS51bmlxdWUodGhpcy5aYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWmIuam9pbigiLCIpKSk7aWYodGhpcy5rYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmtiLmxlbmd0aDtnKyspdGhpcy50Y1t0aGlzLmtiW2ddLnJlYXNvbl09PXRoaXMudGNbYV0mJmIucHVzaCh0aGlzLmtiW2ddLmRldGFpbCksdGhpcy50Y1t0aGlzLmtiW2ddLnJlYXNvbl08CnRoaXMudGNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmtiW2ddLmRldGFpbCksYT10aGlzLmtiW2ddLnJlYXNvbik7dGhpcy50Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihnPWUudW5pcXVlKGIpLGE9YSsiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmZnfSxDZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuZ2d9LGVvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ha30sbWE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkfSxrZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5mZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuZ2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmJkfSxCZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxZbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuSml8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5ybnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuZWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVShhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZWp8fG9hOyhmdW5jdGlvbihjKXtjLmZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmZqfHxwYTsoZnVuY3Rpb24oYyl7Yy5naj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuZ2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkJsfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm1oPXRoaXMuc2I9ITE7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubWg9ITApO3RoaXMuTWg9ITE7dGhpcy5VZygpO3RoaXMuSGUoKTt0aGlzLnVsPSExfSxVZzpmdW5jdGlvbigpe3RoaXMuc2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnNiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk1oPWE7aWYodGhpcy5taCl7dGhpcy5IZSgpO2lmKHRoaXMuc2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxIZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNiKXt2YXIgYT10aGlzLk1oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMuc2I9ITApO3RoaXMuVShiKX19LExhOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuT2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLk9kKGIpfS5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmdmJiYoMCx0aGlzLmdmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LEplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Canx8c2E7KGZ1bmN0aW9uKGMpe2MuQWo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG1hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5iZDt0aGlzLmlzUGxheWluZz10aGlzLm5lPSExO3RoaXMucGU9MTt0aGlzLmNkPVtdO3RoaXMuQmI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLm5lPSExO3RoaXMucGU9MTt0aGlzLmNkPVtdO3RoaXMuQmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5wZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkJiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGc9MDtnPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2crKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ddLnRhZyl7dGhpcy5CYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkJiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkJiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuQmI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPApkLmxlbmd0aDtnKyspYS5vbihkW2ddLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZ10mJih0aGlzLm5lPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZ10mJnRoaXMuSmgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5abSYmIXRoaXMuemEoKSYmKHRoaXMuQmI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubWEoKSx0aGlzLmdldFBsYXllcigpLnVsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuSWI7YiYmKGIuSGQoKSxiLnJkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5jZC5pbmRleE9mKGIpJiZ0aGlzLmNkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuaWEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5jZC5sZW5ndGg+PXRoaXMucGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5HZT90aGlzLkdlKys6dGhpcy5HZT0xOnRoaXMuRmU/CnRoaXMuRmUrKzp0aGlzLkZlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLktmKGIudmlkZW9UYWcpP2Iuc2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5uZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuRmU+dGhpcy5HZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlVnKCksYi5IZSgpLGIuc2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Banx8dGE7KGZ1bmN0aW9uKGMpe2MuQ2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5XbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpnLnNifHx0aGlzLk0oZyl8fHRoaXMuQ20oZyl8fCh0aGlzLk4oZyksZz1uZXcgdGEoZyx0aGlzLkYpLGcuSigpLGcuZigpKX19dGhpcy5QKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxXbDpmdW5jdGlvbigpe3ZhciBhPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQ2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLk1tfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOnRoaXMuWCgpKTp0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuVmQoYSl9LmJpbmQodGhpcykpfSxWZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5WJiZ0aGlzLlYoKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGcpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnZrfHx4YTsoZnVuY3Rpb24oYyl7Yy51az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuTWM9dGhpcy5CYT10aGlzLmpkPSExO3RoaXMuVGg9ZS5PYigxMCk7dGhpcy5SZj0hMDt0aGlzLnpjPXRoaXMudGg9ITE7dGhpcy5jbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSWgoKSx0aGlzLmZsKCksdGhpcy52YigpKX0sY246ZnVuY3Rpb24oYSl7cmV0dXJuIGUuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxycTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuamEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlcsIjsiLHR5cGVvZiBhLlcsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVz9hLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlc/dHlwZW9mIGEuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5HYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5HYT9hLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkdhP3R5cGVvZiBhLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5HYT9hLkcuR2EoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLkdhP3R5cGVvZiBhLkcuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5sZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmxlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEubWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5tZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS52ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS52ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcudmU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy52ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApLYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLkpjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sZ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5NYyl7dmFyIGE9dGhpcy5KYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLk1jPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5NYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLk1jfSxBbTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoKXt2YXIgYT10aGlzLkpjKCksYj10aGlzLnltKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuc2g9ITApfXJldHVybiB0aGlzLnNofSx5bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuamQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmpkPSEwKTtyZXR1cm4gdGhpcy5qZH0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuSG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sSG46ZnVuY3Rpb24oKXt0aGlzLnpjPSEwO3ZhciBhPXRoaXMuZ2goKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5IKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5BYz0hMDtlLkgoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuQWM9ITA7aWYoZS5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuQWM9ITA7ZS5IKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5BYz0hMDtlLkgoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkFjPSEwO2UuSCgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuS2cmJmEuYWRzJiYodGhpcy5LZz1hLmFkcyk7cmV0dXJuIHRoaXMuS2d9LGZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5tYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5KaCgpfS5iaW5kKHRoaXMpKX0sdGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuSWEmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmdoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRkKCl9LmJpbmQodGhpcyksNTApKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQW0oKSl7dmFyIGI9dGhpcy5KYygpLGc9dGhpcy5LYygpO2ImJmcmJih0aGlzLnpjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudGg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkpjKCksYT10aGlzLktjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnRoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmCmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGdsOmZ1bmN0aW9uKCl7dGhpcy5GY3x8KHRoaXMuRmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkZjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuRmM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuRmMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5GYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2woKX0uYmluZCh0aGlzKSwxMCl9LAp0YjpmdW5jdGlvbigpe3JldHVybiBlLkRlPyExOnRoaXMudmF9LERhOmZ1bmN0aW9uKCl7aWYodGhpcy5xbSgpKXt0aGlzLnZhPSEwO2lmKGUuSCgiZ2lnYS5kZSIpfHxlLkgoInNwaWVsZXRpcHBzLmRlIil8fGUuSCgia2luby5kZSIpfHxlLkgoImRlc2lyZWQuZGUiKSl0aGlzLlJmPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scW06ZnVuY3Rpb24oKXtpZigwPD1lLlVhKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZS5IKCJnaWdhLmRlIil8fGUuSCgic3BpZWxldGlwcHMuZGUiKXx8ZS5IKCJraW5vLmRlIil8fGUuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkVkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuU2woKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLkRlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpPyh0aGlzLncoKSx0aGlzLmlhKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlJmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlJmLGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxvbDpmdW5jdGlvbigpe3RoaXMuaHF8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2woKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy51a3x8eWE7KGZ1bmN0aW9uKGMpe2Mud2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2ddKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLk1lKGIpKXthPWI7Zm9yKHZhciBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGI9bmV3IHhhKGFbZ10pLGIuZ2F8fHRoaXMuTShiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5UYyl9fSl9KShjKTsKdmFyIHphPWMud2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLk5qfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5mPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5YKCk7cmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8CihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLlgoKX0sc246ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JYixnPXRoaXMuamEoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIubWMmJigwPD1nLmluZGV4T2YoZCl8fGIuSGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLm5mPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sdWE6ZnVuY3Rpb24oKXt0aGlzLm5mKys7aWYoMTA8dGhpcy5uZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LExhOmZ1bmN0aW9uKCl7fSxWZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7CnZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5JZSlpZih0aGlzLktifHwodGhpcy5LYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLktiKyssMTU8dGhpcy5LYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLkllPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy50YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLkspLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx0YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZz0hMDtnfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBnfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLkJhKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5KbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkpsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Euc24oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiYKd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBSKGFbYl0pO2cuZ2F8fHRoaXMuTShnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy5Cbnx8RmE7bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLmRoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudW49YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLnVuKXtjYXNlICJiZWZvcmUiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZywKYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVShnKTt0aGlzLndkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy53ZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMud2QpfSxrYTpmdW5jdGlvbigpe3JldHVybiEwfSxubDpmdW5jdGlvbigpe2UueWgodGhpcy53ZCk7ZS5WZSh0aGlzLndkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sYWY6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBHYT1jLnlqfHxHYTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLApiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIEhhPWMueGp8fEhhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLmRoKGEsImVsZW1lbnRJRCIpO2lmKGUueWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5NKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuVmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuVmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhLEphPW5ldyBJYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBLYT0KYy5Eanx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnNqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sT2s6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy5zanx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCxmLGMpe3RoaXMuRWE9Yjt0aGlzLllnPXRoaXMuRWk9ITE7dGhpcy5LaD1kO3RoaXMuaWk9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuRWE9bmV3IEMoYikpO3ZhciBoPQp0aGlzLmpiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbSYmbS5ZZSh0aGlzLkVhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2YmJjQhPWgucmVhZHlTdGF0ZSYmZihoKX0uYmluZCh0aGlzKX1jLnRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBiKXt2YXIgYT1iLGI9IiIsZDtmb3IoZCBpbiBhKWIrPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLllnJiYoYis9CiImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5qYi51cmxDYWxsZWQ9dGhpcy5FYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5qYi5vcGVuKHRoaXMuRWEubWV0aG9kLHRoaXMuRWEudXJsLCExKTp0aGlzLmpiLm9wZW4odGhpcy5FYS5tZXRob2QsdGhpcy5FYS51cmwsITApLHRoaXMuRWl8fCh0aGlzLmpiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5qYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5qYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5qYi5zZW5kKGIpfWNhdGNoKGYpe2I9dGhpcy5FYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8dGhpcy5FYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpLG0mJm0uWWUodGhpcy5FYS51cmwpJiYKIWI/ZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOm0uWWUodGhpcy5FYS51cmwpLHRoaXMuS2gmJnRoaXMuS2goKX1yZXR1cm4gdGhpcy5qYn19fSkoYyk7dmFyIExhPWMudGp8fExhOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5GYT10aGlzLmllPSExfWMuYWo9YTthLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxhbzpmdW5jdGlvbihiKXt0aGlzLkZhPWJ9LE1uOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3hwOiJBZENsaWNrVGhydSIsenA6IkFkRXJyb3IiLEFwOiJBZFN0b3BwZWQiLERwOiJBZExpbmVhckNoYW5nZSIsRXA6IkFkVGFnUGFyc2VkIixIcDoiQWRWaWRlb0NvbXBsZXRlIixLcDoiQWRMb2FkZWQiLExwOiJBZFNraXBwZWQiLE1wOiJBZFN0YXJ0ZWQiLEJwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsQ3A6IkFkSW1wcmVzc2lvbiIsCnlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLmllLGFbZF0pfSxMbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuRmEmJnRoaXMuRmEuaGUpZm9yKHZhciBhIGluIHRoaXMuRmEuaGUpdGhpcy5GYS5oZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkZhLHRoaXMuRmEuaGVbYV0pO3RoaXMuRmEmJnRoaXMuRmEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuRmEuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmllJiYKdGhpcy5NbigpO3RoaXMuRmEmJnRoaXMuTG4oKX19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5JYT0hMTt0aGlzLmJjPSIiO3RoaXMua2Q9dGhpcy5hYz10aGlzLmxiPW51bGw7dGhpcy5RZz10aGlzLndiPXRoaXMuJGU9ITE7dGhpcy5BYT0iIjt0aGlzLlplPSExO3RoaXMucWE9dGhpcy5MYz0iIjt0aGlzLlVlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnRmPSExO3RoaXMuaGE9W107dGhpcy5RZT10aGlzLlJiPSIiO3RoaXMuZmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5lZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMueWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuWWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuU2I9IiI7dGhpcy5UYj1bXTt0aGlzLlViPVtdO3RoaXMuWGM9W107CnRoaXMucWM9IiI7dGhpcy5EYj0hMTt0aGlzLlVkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubGM9ITE7dGhpcy5GZz10aGlzLiRkPW51bGw7dGhpcy5HZj10aGlzLmhiPXRoaXMuUGc9dGhpcy5ZZD10aGlzLlNmPXRoaXMubWQ9dGhpcy51Yz0hMTt0aGlzLiRhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkJkPTA7dGhpcy5vaD0hMTt0aGlzLm5oPTFFMzt0aGlzLkJjPSExO3RoaXMuUGE9MUUzO3RoaXMuZGQ9dGhpcy5lZD0iIn1jLnVqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLklhLGFkdGFncGFyYW1ldGVyOnRoaXMuYmMsYWR0YWdtb2RpZmllcjp0aGlzLmxiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5hYyxhZHRhZ3JlZ2V4OnRoaXMua2QsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuJGUsc2lkZWxvYWRzOnRoaXMud2IsZGlzYWJsZXRlc3RzOnRoaXMuUWcsaG9tYWRBbGlhczp0aGlzLkFhLAppc0luaXRpYWxpemVkOnRoaXMuWmUsZ2xvYmFsQ29uZmlnOnRoaXMuTGMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLlVlLHNlcnZlcjp0aGlzLmhhLHN2bUNvbmZpZzp0aGlzLlJiLGhvbWFkQWRwYXRoOnRoaXMuUWUsSE9NQURfVkVSSUZJRUQ6dGhpcy5mZSxIT01BRF9CTE9DS0VEOnRoaXMuZWUsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMuWWIsdGVzdEhpZGU6dGhpcy5TYix0ZXN0VGFnczp0aGlzLlRiLHRlc3RUYWdzSlM6dGhpcy5VYix0ZXN0VGFnc1hIUjp0aGlzLlhjLHRlc3QzUENvb2tpZTp0aGlzLnFjLHRocm90dGxlOnRoaXMuVWQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5sYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkZnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMudWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1kLAp1c2VTdHJpY3RDaGVja3M6dGhpcy5TZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5ZZCxjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy55YSxzZXJ2ZXJJZDp0aGlzLnhmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5hYix2cGFpZDp0aGlzLmhiLHNraXBBbGxvd2VkOnRoaXMuR2Ysdm1hcHM6dGhpcy5YZixhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuQmMsYWRGYWxsYmFja1VSTDp0aGlzLmVkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5kZH19LFVuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLklhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLmJjPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMubGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYKKHRoaXMuYWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5rZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLiRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy53Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlFnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5aZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5MYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlVlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaGE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5SYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuUWU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuZmU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5lZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYKKHRoaXMueWI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5ZYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuU2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuVGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5VYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlhjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5xYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuVWQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmxjPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLkZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnVjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMubWQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuU2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5ZZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuJGE9Yi5jb25maWdGYWlsdXJlcyk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy54Zj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmFiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuaGI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuR2Y9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuWGY9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5CYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuZWQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5kZD1iLmFkRmFsbGJhY2tDb25maWcpfSxubTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2FdJiYxPT10aGlzLiRhW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LHpmOmZ1bmN0aW9uKGIpe3RoaXMuJGFbYl09ITB9LFhsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYV0mJjE9PXRoaXMuJGFbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sU2Q6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKYj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk9iKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWUuWmsoYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZj0iIixjPSIiLGU9IiIsaD0iIjtpZighdGhpcy5JYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2Y9dGhpcy5YZShiKTtjPXRoaXMuYWEoYik7Zj8odGhpcy5OYygpP2U9YjplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5TYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLmJjfHx0aGlzLmxifHx0aGlzLmFjfHx0aGlzLmtkKSYmKGg9dGhpcy5hbihoKSk7Yj1uZXcgQyhlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKToKdGhpcy5abChjLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5DYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LFhlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5OYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaGEmJnRoaXMuaGEubGVuZ3RoJiYwPHRoaXMuaGEubGVuZ3RoJiYoYT10aGlzLmhhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsCiIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxZZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLlhlKGIpO3JldHVybiBhfSxabDpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LENkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFbdGhpcy54Zl19LFNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DZCgpLGE9dGhpcy5FZigobmV3IERhdGUpLmdldFRpbWUoKSsKIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sR2g6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sJG06ZnVuY3Rpb24oYixhKXt2YXIgZD1lLmFhKGIpLGY9IiIsZj0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxCPTA7QjxoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy5HaChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pOwpoPVtdO2ZvcihsIGluIGYpaC5wdXNoKGwrIj0iK2ZbbF0pO2Y9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZj10aGlzLkdoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYW46ZnVuY3Rpb24oYil7dGhpcy5iYyYmKGIrPXRoaXMuYmMpO2lmKHRoaXMubGIpZm9yKHZhciBhIGluIHRoaXMubGIpdGhpcy5sYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5sYlthXSkpO3RoaXMuYWMmJihiPXRoaXMuJG0oYix0aGlzLmFjKSk7cmV0dXJuIGJ9LG1sOmZ1bmN0aW9uKCl7dGhpcy55YSYmdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLmhsKHRoaXMueWEuY2xpZW50QVBJcyl9LGhsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmCmEuYm8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmFvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZixjLGUpe209dGhpczt0aGlzLlplPSEwO3RoaXMuTGM9Yjt0aGlzLnFhPWE7dGhpcy50Zj1kO3RoaXMuJGQ9Zjt0aGlzLmdjPWM7dGhpcy55YT1lfHx7fTt0aGlzLm1sKCk7dGhpcy5RbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLk9tKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkRjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuRGMoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sdWI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxRbTpmdW5jdGlvbigpe3RoaXMuSmEobmV3IEModGhpcy5MYyt0aGlzLnRlKCJnbG9iYWwiKSksdGhpcy5sbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy56ZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkRjKCl9LmJpbmQodGhpcyksITApfSxPbTpmdW5jdGlvbigpe3RoaXMuSmEobmV3IEModGhpcy5xYSt0aGlzLnRlKCJjbGllbnQiLC0xIT10aGlzLnFhLmluZGV4T2YoIj8iKSkpLHRoaXMuRGMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuemYoImNsaWVudCIpO3RoaXMuc2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LHRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ7ZD0oYT8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5PYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYKKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5tZCl7dGhpcy5tZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZyl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTsKZm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5nYz0hMSk7ImZvY3VzLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuZ2M9ITEpO3RoaXMuZ2MmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5nYz90aGlzLmdjKCk6KGEoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYSw1MDApKTt0aGlzLlM9dGhpcy5VZT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy5lZSkpO3RoaXMuV2IoKTtlLkhjKGsucW4pOyhhPWUuVWEodGhpcy5DZCgpKSl8fChhPWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpOwpifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxsbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZj0hMTt0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGY9ITApfWNhdGNoKGgpe31pZighKGZ8fGEuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUmJ8fAp0aGlzLkFhfHx0aGlzLkRjKCk6KHRoaXMuSWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy5XYigpKX19LERjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7dHJ5e3ZhciBjPWUuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihhPSEwKX1jYXRjaChoKXt9Yz1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8ZC5zZXJ2ZXIubGVuZ3RoO2IrKyl7dmFyIGE9ZC5zZXJ2ZXJbYl07dHJ5e3ZhciBnOyhnPXZvaWQgMD09PWEpfHwoZz0hYS5yZXBsYWNlKCJbaGFzaF0iLHRoaXMuRWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSkpO2lmKGcpcmV0dXJuITF9Y2F0Y2goZil7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmhhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5oYS5sZW5ndGg7YisrKXRoaXMuaGFbYl09dGhpcy5oYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuSCgid2ViLmRlIil8fGUuSCgiZ214Lm5ldCIpfHxlLkgoImdteC5hdCIpfHwKZS5IKCJnbXguY2giKXx8ZS5IKCIxdW5kMS5kZSIpKSYmIXRoaXMuTmMoKSlmb3IoYj0wO2I8dGhpcy5oYS5sZW5ndGg7YisrKXRoaXMuaGFbYl09dGhpcy5oYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5kZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5SYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuUWU9ZC5hZHBhdGh8fCIiO3RoaXMueGY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuaGEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5SYiYmdGhpcy5BYSYmdGhpcy5oYS5sZW5ndGg/dGhpcy5PYyghMSk6KHRoaXMuSWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy5XYigpKX0sY2k6ZnVuY3Rpb24oYil7dGhpcy5lZHx8KHRoaXMuZWQ9Ynx8CiIiKX0sT2M6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEModGhpcy5TYygpKSxkPXRoaXMuYWEodGhpcy5SYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQyh0aGlzLlJiK3RoaXMudGUoImN1c3RvbWVyIikpO3RoaXMuSmEoYSx0aGlzLndvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnpmKCJjdXN0b21lciIpO2I/dGhpcy5paz90aGlzLnNhKCJub1NWTUNvbmZpZyIpOih0aGlzLmlrPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5PYyghMCl9LmJpbmQodGhpcyksITApfX0sd286ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9CmIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5sYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubGM9ITA7dGhpcy5PYyghMCk7cmV0dXJufX1hPSExO3RyeXt2YXIgYz1lLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWlmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiYoZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGhpZGUiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFncyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzanMiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc3hociIpKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLlNmPXRoaXMuZ2IoZC5zdHJpY3QpO3RoaXMuWWQ9dGhpcy5nYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7CnRoaXMuUGc9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmFiPXRoaXMuZ2IoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmdiKGQuZW5hYmxlZCk7dGhpcy5TYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlViPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWGM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnFjPWQudGVzdDNwY29va2llfHwiIjt0aGlzLmJjPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMubGI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuYWM9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmtkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLiRlPWQuanNwb3B1cHN8fCExO3RoaXMud2I9ZC5zaWRlbG9hZHN8fCExO3RoaXMuaGI9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLmhiO3RoaXMuR2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5uZD1kLmNhcHRpb25fZHVyYXRpb258fAohMTt0aGlzLlhmPWQudm1hcHN8fCIiO3RoaXMuQmM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmRkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlVkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMubGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmxjPSEwLHRoaXMuT2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuSm8oKSYmKHRoaXMuU2J8fHRoaXMuVWJ8fHRoaXMuVGJ8fHRoaXMuWGMpP3RoaXMudGY/KHRoaXMuSWE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy55ZSgpLHRoaXMuV2IoKSk6dGhpcy56bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLk9mKCkpfX0sem86ZnVuY3Rpb24oKXt0aGlzLnlvKCk7dGhpcy5BbygpfSxBbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5ZKDEwKSxoPWUuWSgxMCksQj1lLlkoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQ2IoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS52ZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLkNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLnNhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxPZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuV2IoKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy51Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5JYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIoYikpLHRoaXMuV2IoKSx0aGlzLnllKCkpfSx5bzpmdW5jdGlvbigpe2lmKHRoaXMuU2Ipe3ZhciBiPWUudmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLkZtKCkpdGhpcy5UZCh0aGlzLlliLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuU2IpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5TYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlRkKHRoaXMuWWIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmxpKCl9fWVsc2UgdGhpcy5saSgpfSxNZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuT2IoKSksCnRoaXMuRG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLkxmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLkxmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlRkKHRoaXMuWWIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5UYj10aGlzLlhjKSYmdGhpcy5UYi5sZW5ndGgpe3ZhciBkPXRoaXMuVGIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5MZigpfSxEbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5KYShuZXcgQyhiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5PYigpKSx0aGlzLkVvKGYsMDxkLmxlbmd0aD9iLmJpbmQodGhpcyk6dGhpcy5NZi5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSl9Y2F0Y2goYyl7dGhpcy5NZigpfX1mdW5jdGlvbiBhKCl7dGhpcy5UZCh0aGlzLlliLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlViJiZ0aGlzLlViLmxlbmd0aCl7dmFyIGQ9dGhpcy5VYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLk1mKCl9LEVvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLnFjKXRyeXtlLkVkKHRoaXMucWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuRGI9IXRoaXMuZ2IoYS5jYyk7dGhpcy5PZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5qaSgpfWVsc2UgdGhpcy5PZigpfSxqaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuV2IoKTt0aGlzLnllKCl9LEZtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LApXYjpmdW5jdGlvbigpe3ZhciBhPSIwIixnPSIwIjt0cnl7ZS5DYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnVjJiYoZz0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitnLCEwKTt0aGlzLnFjJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuRGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLmZlKSk7dGhpcy4kZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLiRkJiZ0aGlzLiRkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkRifSl9LGxsOmZ1bmN0aW9uKCl7aWYodGhpcy5ZZCYmdGhpcy5ubSgpKXt2YXIgYT10aGlzLlhsKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZyl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPQphLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxKYTpmdW5jdGlvbihhLGcsZCxmLGMsaCl7dGhpcy5CZHx8KHRoaXMuQmQ9MCk7dGhpcy5CZCsrO3RoaXMuQmQ+dGhpcy5uaCYmIXRoaXMub2gmJih0aGlzLm9oPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5uaCwhMCkpO2E9bmV3IExhKGEsZyxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtmJiYoYS5FaT0hMCk7YyYmZS5EbSgpJiYoYS5ZZz0hMCk7aCYmKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0saWw6ZnVuY3Rpb24oKXt0aGlzLlltfHwodGhpcy5ZbT0hMCxlLkNhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LApmdW5jdGlvbihhKXt2YXIgZz1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihmPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGZbMF0mJihmPWZbMF0pLGYpe2Y9ZiYmZi5jaGlsZE5vZGVzJiZmLmNoaWxkTm9kZXNbMF0/Zi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLk5jKCl8fChmPXRoaXMuYWEoZiksZj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGQpe31lLm5ldHdvcmtTdGF0ZT09CmUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9ZS5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGcpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpO2UubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LAp4bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5YZn0samw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkphKGEsdGhpcy5Wby5iaW5kKHRoaXMpLHRoaXMuVW8uYmluZCh0aGlzKSl9LFZvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8CnRoaXMuSGwoKX0sVW86ZnVuY3Rpb24oKXt9LEhsOmZ1bmN0aW9uKCl7ZS5IYyhrLkdsKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx5ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMud2IubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy53YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5iYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZmEoKV09dGhpcztlLmJiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEpvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuVWR9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLAphfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxZOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBnPSIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxnYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxDYjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sYWE6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbZ1tmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sRWY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsZT1BcnJheSg4MCksaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZik7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1oO249aztxPWw7cj1tO3U9dDtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZxfH5uJnIpK3UrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7Zm9yKGY9MjA7Mzk+PWY7ZisrKXY9ZChjLDUpKyhuXnFecikrdStlW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1xLHE9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTQwOzU5Pj1mO2YrKyl2PWQoYyw1KSsobiZxfG4mcnxxJnIpK3UrZVtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZj02MDs3OT49ZjtmKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihnKGgpK2coaykrZyhsKStnKG0pK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLnVqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5MaXx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5lYj1hLmMuUigpOnRoaXMuZWI9IiI7YS5jLnZoJiZhLmMudmgoe3BhdXNlOnRoaXMuSGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy4kaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5oZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLlBvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEub2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5oYz10aGlzLmxkPSExO3RoaXMuWGs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9Zzt0aGlzLmliPXt9O3RoaXMudmlkZW89e307dGhpcy5RZD17fTtlLnJiKCJuZXdCaWdBZElkIik7dGhpcy4kaz1lLlkoMTApOwp0aGlzLklmPTA7dGhpcy5oZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmhkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmhkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlVrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUmM9dGhpcy5QZD0hMTt0aGlzLkVoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5zZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMubWM9ITE7dGhpcy53bD1lLlkoMTApO3RoaXMuTmI9ZS5ZKDEwKTt0aGlzLkxiPWUuWSgxMCk7dGhpcy5laT1lLlkoMTApO3RoaXMuY29uZj17fTt0aGlzLmFlPQp0aGlzLlhiPXRoaXMuQ2U9dGhpcy5zZD10aGlzLlJkPXRoaXMueGI9dGhpcy5zYz10aGlzLk5oPXRoaXMuQmU9dGhpcy54ZD10aGlzLktvPXRoaXMuQWI9dGhpcy5NYj0hMTt0aGlzLnhjPVtdO3RoaXMubmM9e307dGhpcy5tbj0yMDA7dGhpcy4kZj10aGlzLlljPXRoaXMuQ2M9dGhpcy5aZj10aGlzLnNmPSExO3RoaXMua2Y9e319Yy5vaj1hO2EucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBnfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMucG8oKTtlLm8oay5Mayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxjZjpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLkFiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLklmKyssZS5yYigibmV3U21hbGxBZElkIiksdGhpcy5BLmxsKCksYz1tLmdldENvbmZpZygpLGUuRGUmJih0aGlzLkEuVW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5JYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5yaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkVoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLnJpKCksCm5ldyBTKHRoaXMsYSx0aGlzLkVoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmhiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB2Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2Yy5jZihhLGcsZCl9LDUwKX19LG9mOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5hZT10aGlzLlhiPXRoaXMuQmU9dGhpcy54ZD0hMTt0aGlzLmI9YTt0aGlzLmpvKHRoaXMuYik7dGhpcy5qaChhKTt0aGlzLnhjPXRoaXMuJGcoYSk7dGhpcy5wbCgpfSxqaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5RZD10aGlzLmhtKGIpKSx0aGlzLmpoKGIucGFyZW50KSl9LCRnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy4kZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLlJsKGIpKSk7cmV0dXJuIGd9LFJsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5MJiZhLkwuZ2V0QXR0cmlidXRlKXtnPWEuTC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxobTpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuTCl7Zz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuTC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEucGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scmE6ZnVuY3Rpb24oYSl7YS5aYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS51ZCYmYS51ZC5lcnJvciYmYS51ZC5lcnJvci5jb2RlJiYoZz1hLnVkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuJGMuY29kZTpnPT1GLmplLmNvZGU/ZS5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZS5kZigpLGc9PUYuZGcuY29kZSYmZS5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7ZS5vKGsuRmwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnFvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuRGImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5EYiwhMCk7YnJlYWs7Y2FzZSB2LmJnLmNvZGU6ZS5vKGsuV28sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmUubyhrLnFwLAp0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5rZS5jb2RlOmUubyhrLnJwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuZ2UuY29kZTplLm8oay5lbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuY2UuY29kZTplLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuYWcuY29kZTplLm8oay5Ubyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLldhKCJ1bmtub3duIil9dGhpcy5pYyhhKTt0aGlzLlFhKCl9LGljOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTmEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5OYS5wb3AoKTt0aGlzLmJmKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxqbzpmdW5jdGlvbihhKXt0aGlzLkNlPSExO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5EZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmliLnpJbmRleD1nO2c9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC56ZCYmKGM9ZC56ZCgpKTtjLnZpZGVvU2xvdCYmKGc9Yy52aWRlb1Nsb3QsdGhpcy5zZj0KITApfWNhdGNoKGgpe31nLnNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5VayYmdGhpcy5wbGF5ZXIuSmUoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkplKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk8ubGVuZ3RoO2QrKylnLmNhblBsYXlUeXBlKGEuT1tkXS50eXBlKSYmCnRoaXMuUGsoZyxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLnNmJiZnLmxvYWQoKTtpZih0aGlzLm1pKGcpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlNrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5zZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuc2woKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXToKYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZyksdGhpcy5obygpKTp0aGlzLmIub3JpZ2luLlJnKHYuZ2UpfSxobzpmdW5jdGlvbigpe3RoaXMuWmY9ITA7dGhpcy54Yj10aGlzLnNjPSExO3RoaXMuYS5jLmthJiZ0aGlzLmEuYy5rYSgpJiYoZS5vKGsuSWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLnhiPSEwKTtlLnplKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm9hJiZlLlRrKHRoaXMuYi5vcmlnaW4ub2EpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5CO3RoaXMuYS5CPUQucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQixhKTt0aGlzLmEuT2goKTt0aGlzLmEuRmYoKTtmb3IoYT10aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYS5GZigpO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5EZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLnhiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuUWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLkRmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5rbSgpLGM9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmYi51cmwmJjA8PWIudXJsLmluZGV4T2YoIndlbGVjdC5qcyIpJiZ0aGlzLkEpe3ZhciBoPXRoaXMuQS5nZXRDb25maWcoKTtoJiZoLmFkRmFsbGJhY2tDb25maWcmJmguYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyYmKGM9SlNPTi5zdHJpbmdpZnkoaC5hZEZhbGxiYWNrQ29uZmlnKSl9dmFyIGs9Cntob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuRCwiY29uZmlnIixrKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsCmspfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUueGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIiwKdGhpcy5BKTt0aGlzLkQuc3JjPWE7ZS51ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlJkJiZ0aGlzLmEuYy51YSgpJiZlLm8oay5FYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5rYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy54Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZXAoKSx0aGlzLmEua2MoITApLCF0aGlzLlhiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSwKdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5YYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5hZT0hMDtlLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5XZSh0aGlzLlhiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEua2MoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmtjKCEwKSx0aGlzLm1wKCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtwKCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmxwKCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubnAoKTsiQWRWaWRlb0NvbXBsZXRlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLm5iKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UubyhrLkhnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5CY3x8dGhpcy5ZYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChkKXt3aW5kb3cub3BlbihoLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ocCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT0KYS5kYXRhLm5hbWUmJmUubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlljJiYodGhpcy4kZj0hMSx0aGlzLnBjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy54Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUWIoIm11dGVkIiwidXNlciIpLGUubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLnhiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5RYigidW5tdXRlZCIsCiJ1c2VyIiksZS5vKGsuUWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZS5vKGsucWUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtlLnVlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcykpO2UudWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEudWcoZnVuY3Rpb24oYSl7ZS5sYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMudHJhY2soInBhdXNlIik7ZS5vKGsub2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuc2M9ITB9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7CmEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5zYz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLmdpKCk7ZS5vKGsubGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sbXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWGEoInN0YXJ0Iik7ZS5vKGsuZmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sCmtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMueGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2UubyhrLm5nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtlLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMuVWYoKTt0aGlzLlhhKCJjb21wbGV0ZSIpfSxDaTpmdW5jdGlvbihhKXtpZih0aGlzLkQmJnRoaXMuRC5wYXJlbnROb2RlJiZ0aGlzLkQucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLldhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgZz0KdGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtnLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZyk7ZS56ZSgpO3RoaXMuRD0hMTt0aGlzLlFhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGc9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZyYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZz1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZy5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2UubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LFBrOmZ1bmN0aW9uKGEsZyl7ZnVuY3Rpb24gZChhLGIpe2lmKGIuSWEmJmIuaXNFbmFibGVkJiYhYi5OYygpKXt2YXIgZD1iLmFhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKYy5zcmM9ZChnLHRoaXMuQSk7Yy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChnLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sU2s6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5XZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5VZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlZmLmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5XZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5VZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlZmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGN8fHRoaXMuV2YoYSl9LmJpbmQodGhpcyksdGhpcy5YaykpfSxXZjpmdW5jdGlvbihhKXtpZighdGhpcy5sZCYmdGhpcy5taSh0aGlzLnZpZGVvKSYmIXRoaXMuTWImJiF0aGlzLmhjKXt0aGlzLmxkPSEwO3RyeXtpZighZS5DYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5iLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuTWJ8fCh0aGlzLk1iPSEwLHRoaXMuTGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5QZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUWEoKTtyZXR1cm59fWNhdGNoKGcpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5GZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy55ZygpO3RoaXMuYS5PaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5KZigpfX0sSmY6ZnVuY3Rpb24oKXt0aGlzLnNkfHx0aGlzLmpnKCl9LGpnOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMudmlkZW8ucGxheSgpO2lmKGcmJmdbImNhdGNoIl0pZ1siY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuc2R8fChhP3RoaXMuUWEoKToodGhpcy5oZighMCksdGhpcy5qZyghMCkpKX0uYmluZCh0aGlzKSk7CmNhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5vYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm9jLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm9jLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy5zZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuSmYoKSl9LmJpbmQodGhpcyk7dGhpcy5MZSgpLmRpKHRoaXMpfSxVZjpmdW5jdGlvbigpe3RoaXMuQS5hYiYmIXRoaXMuTWImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTt0aGlzLkJlPSEwO2UubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5RYSgpfSxNazpmdW5jdGlvbihhKXtmb3IodmFyIGc9W10sZD0hMSxjPTA7YzxhLmxlbmd0aDtjKyspZD1lLmVoKGFbY10pLApnLnB1c2goZCk7YT17aGFzaGVzOmd9O2E9ay5TYShhLHRoaXMudSgpKTtlLm5vKGEpfSxRYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5iZSYmdGhpcy5Nayh0aGlzLmIuYmUpO2lmKCF0aGlzLkNlKWlmKHRoaXMuQ2U9ITAsdGhpcy5hZXx8KGUubyhrLmhuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnpifHx0aGlzLmIudmMpe2UucmIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuSWYrKzt0aGlzLmhjPXRoaXMubGQ9ITE7dHJ5e3RoaXMuTGQodGhpcy52aWRlbyl9Y2F0Y2goZyl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5pYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChjKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLlBkPSExO3RyeXt0aGlzLmEudmkoKX1jYXRjaChoKXt9dGhpcy5SZD0hMDt0aGlzLmEuUGUoKTsKdGhpcy5tYz0hMTt0aGlzLkxlKCkuWWgoKTt0aGlzLmIuemImJnRoaXMuYi5vcmlnaW4uamYoKTt0aGlzLmIudmMmJihhP3RoaXMuYi5vcmlnaW4uSGgoKTp0aGlzLnJkKCkpfWVsc2UgdGhpcy5yZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkxkKHRoaXMudmlkZW8pLHRoaXMuVmYoYSkpfSxWZjpmdW5jdGlvbihhKXt0aGlzLmhjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5pbCgpO3RoaXMuYi5vcmlnaW4uUmcodi5nZSl9LEFpOmZ1bmN0aW9uKCl7aWYodGhpcy5Lbyl0aGlzLlFhKCk7ZWxzZXt0aGlzLm1jPQohMDt0aGlzLmEuYy51YSYmIXRoaXMuUmQmJnRoaXMuYS5jLnVhKCkmJmUubyhrLkVjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk5vKGEpO2lmKCF0aGlzLlhiKXt2YXIgZz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuWGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmFlPSEwO2UubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6ZyxwZXJjZW50OmQsCnN0YXJ0VGltZTohMX07ZS5XZSh0aGlzLlhiKX1kPSIiO3RoaXMuYi5IZiYmKGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuSGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuUGR8fCh0aGlzLlBkPSEwLGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLnpiPyh0aGlzLmhjPXRoaXMubGQ9ITEsdGhpcy5MZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLlBkPSExLHRoaXMuYS52aSgpLHRoaXMuYi5vcmlnaW4uamYoKSk6CnRoaXMuUWEoKX0uYmluZCh0aGlzKSkpKSxnLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuaGQucmVwbGFjZSgiW3RpbWVdIixlLlpnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMuc2U9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5OaHx8KHRoaXMuTmg9ITAsdGhpcy54ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE5vOmZ1bmN0aW9uKGEpe2UubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5NYnx8KDA9PWEmJih0aGlzLkFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLkFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5EYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsCmZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5NYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmFiJiZ0aGlzLlhhKCJzdGFydCIpLGUubyhrLmxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZS5vKGsucWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYWImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy54ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmlnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PQpNYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5hYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUubyhrLm5nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYWImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGcpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxnLCEwKX0scG86ZnVuY3Rpb24oKXtlLldkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LApnaTpmdW5jdGlvbigpe2UuV2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scW86ZnVuY3Rpb24oKXtlLldkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7ZS5XZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5aZnx8dGhpcy5BLmFiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFFiOmZ1bmN0aW9uKGEsZyl7dGhpcy5BLmFiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsZywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZyl7aWYoIXRoaXMuTWIpe3RoaXMua2YmJnRoaXMua2YudHJhY2smJnRoaXMua2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLkRlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwKImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5pbSh0aGlzLmIuTmEsYSl9Y2F0Y2goYyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkNjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuUWQuaW1wcmVzc2lvbnMmJmUuQm0oaC51cmwsdGhpcy5RZC5pbXByZXNzaW9ucyk/dGhpcy5iZihoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuUWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5iZihoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZyl0cnl7dGhpcy5iLk5hPXRoaXMuemwodGhpcy5iLk5hLGEpfWNhdGNoKEIpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWUuQ2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYz0iIjt0aGlzLlpmJiYoYz0iX3ZwYWlkIik7dGhpcy5ZYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxiZjpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQS53YShhKSxkJiZjLk9rKGQpLGZ8fChmPXRoaXMuT2cpLGV8fChlPXRoaXMuT2cpLHRoaXMuUWsoYSksdGhpcy5BLkphKGMsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFFrOmZ1bmN0aW9uKGEpe3RoaXMubmNbYV09Im9wZW4ifSxYaDpmdW5jdGlvbihhKXt0aGlzLm5jW2FdPSJjbG9zZWQifSxwbDpmdW5jdGlvbigpe3RoaXMubmM9Cnt9fSxzbzpmdW5jdGlvbigpe3ZhciBhPTAsYztmb3IoYyBpbiB0aGlzLm5jKXRoaXMubmMuaGFzT3duUHJvcGVydHkoYykmJiJvcGVuIj09dGhpcy5uY1tjXSYmYSsrO3JldHVybiBhfSxpbTpmdW5jdGlvbihhLGMpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1jfSl9LHpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS50ZyYmYS50Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZS5DYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5wYygpO2Vsc2UgaWYodGhpcy5iLm5iKXt0cnl7dmFyIGE9KG5ldyBEYXRlKS5nZXRUaW1lKCk7CnRoaXMuYi5BZXx8KHRoaXMuYi5BZT0xKTtpZigxMDA+YS10aGlzLmIuQWUpcmV0dXJuO3RoaXMuYi5BZT1hfWNhdGNoKGMpe31lLm8oay5IZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuQmN8fHRoaXMuWWMpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIubmJ9Y2F0Y2goYyl7YT13aW5kb3cub3Blbih0aGlzLmIubmIsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5uYiwiX3RvcCIpfWNhdGNoKGcpe3dpbmRvdy5vcGVuKHRoaXMuYi5uYiwiX3RvcCIpfX19LmJpbmQodGhpcyksNTAwKX19LFhvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmhkLnJlcGxhY2UoIlt0aW1lXSIsZS5aZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5BLm5kJiYoYz10aGlzLkEubmQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmIuYmluZCh0aGlzKSwKMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sRmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5uZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sTmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5uZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFlLktmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy53bDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYygpO3RoaXMuTmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IiwKZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYygpO3RoaXMuTmQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOgooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkxiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkxvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucGMoKTt0aGlzLk5kKCl9LmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLmVpO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuSGYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuQ2EoKXx8Cih0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnBjKCk7dGhpcy5OZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLApkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS51ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLklnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5oZigpKTt0aGlzLkdiKCl9fSxHYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHBjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLiRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5mZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLm9lLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLnNjPyhlLmxhKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuc2M9ITEpOihlLmxhKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5zYz0hMCl9LEhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsub2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5mZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlFiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLlFmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUWIoIm11dGVkIiwidXNlciIpLGUubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxNbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpOwp0aGlzLnhiPyhlLmxhKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMueGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMueGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0saGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5RYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuRmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFBvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlFiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLlFmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxvYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLm9jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm9jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5vYyk7dGhpcy5zZHx8dGhpcy5zZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuSmYoKSl9LHJkOmZ1bmN0aW9uKCl7dGhpcy5LbSgpJiZ0aGlzLkptKCkmJih0aGlzLkEudWN8fCJzcGllZ2VsLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuSmImJnRoaXMuT28oKXx8KHRoaXMuc2Q9ITAsdGhpcy5BYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5BYj0hMSksdGhpcy5KZygpKX0sS206ZnVuY3Rpb24oKXt2YXIgYT1lLnZkKCk7aWYoIXRoaXMuQS5oYnx8ZS5DYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGM9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuQ2EoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsYytkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LEptOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuUmN8fChhPQohMCxjLmFkRmFsbGJhY2tVUkx8fChjLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkNjJiZjLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5SY3x8ZS50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuQ2M/ImFueSI6IiIpKyhjLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5SYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuQ2MmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlJjfSxZbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sT286ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgYz1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoYy5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmMuYXZhaWxhYmxlKXtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgZz1lLnhnKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoZylyZXR1cm4gdGhpcy5jZihnLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy5yZCgpfXZhciBjPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuWWwoKTt0aGlzLkNjPXRoaXMuUmM9dGhpcy5ZYz10aGlzLiRmPSEwO3JldHVybiBjPyhlLmJiKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2MsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LEpnOmZ1bmN0aW9uKGEpe3RoaXMuc28oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpnKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5tbik6KHRoaXMuUmQ9ITAsdGhpcy5hLlBlKCksdGhpcy5hLlJuKCksdGhpcy5tYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkJlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGUubyhrLnZsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5MZSgpLlloKCkpfSxMZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEoIm1pblZpcyIpO2EmJihlLlZlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuSGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5uYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi56Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy54YyYmMDx0aGlzLnhjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy54YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy4kaysiLSIrdGhpcy5JZjt0aGlzLmImJnRoaXMuYi5maCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZmgoKSk7cmV0dXJuIGF9LE9nOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5vanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5Hb3x8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubmE9bnVsbDt0aGlzLlc9W107dGhpcy5MPW51bGw7dGhpcy53Yz10aGlzLnljPSExO3RoaXMub2E9IiI7dGhpcy5ZZj0hMTt0aGlzLnFoPSIiO2QmJmQuZW1wdHk/dGhpcy5UbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLnNrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnZkKCksYjtiPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOm0ud2EobS5TZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihlLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuSCgiZmFuZG9tLmNvbSIpfHxlLkgoImdpZ2EuZGUiKXx8ZS5IKCJraW5vLmRlIil8fGUuSCgic3BpZWxldGlwcHMuZGUiKXx8ZS5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8ZygpKXt2YXIgaD1lLkxnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGc9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxsPWZ1bmN0aW9uKCl7cmV0dXJuKGUuSCgiZ2lnYS5kZSIpfHxlLkgoImtpbm8uZGUiKXx8ZS5IKCJzcGllbGV0aXBwcy5kZSIpfHxlLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZygpfHxrKCl8fGwoKXx8ImFwcHNwb3QiPT1jKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLlNkKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLlNkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZS50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bS53YShtLlNkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5KYShiLHRoaXMuU20uYmluZCh0aGlzKSx0aGlzLlBtLmJpbmQodGhpcykpfSxhaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5uYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkpiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5KYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuSmJ8fHRoaXMuSG0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0ueG8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSG06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxTbTpmdW5jdGlvbihhKXt0aGlzLnpuKGEpO3RyeXt0aGlzLm5hPWEucmVzcG9uc2VYTUwsdGhpcy5uYXx8KHRoaXMubmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2LmtlKSl9dGhpcy5XPXRoaXMuYWgoKTt0aGlzLnljPXRoaXMuTmYoKTt0aGlzLndjPXRoaXMua2koKTt0aGlzLnFoPWEudXJsQ2FsbGVkO2lmKHRoaXMuVy5sZW5ndGgpdGhpcy5RYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlJhKHYuJGMse2Vycm9yOnRoaXMuWWY/Ri5qZTpGLmNnfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuVWEodGhpcy5vYSksITApfWNhdGNoKGMpe319fSxUbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5uYXx8Cih0aGlzLm5hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2LmtlKSl9dGhpcy5XPXRoaXMuYWgoKTt0aGlzLnljPXRoaXMuTmYoKTt0aGlzLndjPXRoaXMua2koKTt0aGlzLlcubGVuZ3RoP3RoaXMuUWMoKTp0aGlzLnJhKHRoaXMuUmEodi4kYyx7ZXJyb3I6dGhpcy5ZZj9GLmplOkYuY2d9KSl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlJhKHYuYmcse2RlcHRoOmJ9KSl9LFFjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuVy5zaGlmdCgpO3RoaXMuTG0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMua2goKSxnLHtBZFN5c3RlbTp0aGlzLlFsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMub2YodGhpcy55bCgpKSl9LGpmOmZ1bmN0aW9uKCl7dGhpcy55Yz8odGhpcy55Yz0xPHRoaXMuVy5sZW5ndGgsCnRoaXMuVy5sZW5ndGgmJnRoaXMuUWMoKSk6dGhpcy5wYXJlbnQuamYoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLlFjKCkpOnRoaXMucGFyZW50LkhoKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLkljKCk/dGhpcy5yYSh0aGlzLlJhKHYuY2UpKTp0aGlzLnJhKHRoaXMuUmEodi5hZykpLCExKToodGhpcy5yYSh0aGlzLlJhKHYuJGMsRi5kZykpLCExKX0sb2Y6ZnVuY3Rpb24oYSl7dGhpcy5vYXx8KHRoaXMub2E9IiIpO2EuYmV8fChhLmJlPVtdKTthLmJlLnB1c2godGhpcy5xaCk7YS5OYT1hLk5hLmNvbmNhdCh0aGlzLmVmKCkpO2EuemI9YS56Yj9hLnpiOnRoaXMueWM7YS52Yz1hLnZjP2EudmM6dGhpcy53YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5vYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuWGc7dGhpcy5wYXJlbnQub2YoYSl9LAp5bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5kdXJhdGlvbj10aGlzLkljKCk7YS5PPXRoaXMuaGgoKTthLm5iPXRoaXMuVGwoKTthLnpxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUGwoKTthLkhmPXRoaXMuZ20oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlhnO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlhnO2lmKCF0aGlzLkwmJnRoaXMubmEmJnRoaXMubmEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLkw9dGhpcy5uYTt0cnl7aWYodGhpcy5MJiZ0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5OYT1hLmVycm9yLmNvZGUhPXYuY2UuY29kZT9hLk5hLmNvbmNhdCh0aGlzLlVsKCkpOmEuTmEuY29uY2F0KHRoaXMuY20oKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5pYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmljJiZ0aGlzLnBhcmVudC5pYyhhKSxiPTAsdGhpcy5RYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGljOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmljKGEpfSxSZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaGgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5JYygpfSxOZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5OZigpJiYoYT0hMCk7cmV0dXJuIGF9LHpuOmZ1bmN0aW9uKGEpe3RoaXMub2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5vYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm9hPSJVTktOT1dOIn10cnl7dGhpcy5ZZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMbTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmtoKCkubGVuZ3RofSxraDpmdW5jdGlvbigpe3JldHVybiB0aGlzLktlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFFsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2UodGhpcy5MLCJBZFN5c3RlbSIpfSxlZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnhoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnBiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMueGgoYS5wYXJlbnROb2RlKTohMX0sY206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sVWw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUGE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxVcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5wYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5QYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5QYSktTWF0aC5hYnMoZC1iLlBhKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxQbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5BZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sSWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5wYih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGdtOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUubW8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sS2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnBiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxOZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0scGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5BZChhKToiIn0sQWQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5OZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuc2t8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5Wa3x8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5PPVtdO3RoaXMubmI9IiI7dGhpcy5zPXRoaXMudmM9dGhpcy56Yj0hMTt0aGlzLlJlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5TZT0iIn1jLllqPWE7YS5wcm90b3R5cGU9e3NsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTy5sZW5ndGg7YysrKWlmKDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGFtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5uYSl7dmFyIGE9dGhpcy5vcmlnaW4ubmE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5SZT1hW2RdKX1yZXR1cm4gdGhpcy5SZX0sCmZoOmZ1bmN0aW9uKCl7aWYodGhpcy5TZSlyZXR1cm4gdGhpcy5TZTt2YXIgYT0iIjsoYT10aGlzLmFtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5TZT1hfSxrbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk8ubGVuZ3RoO2MrKylpZigwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuWWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuc3B8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtrZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixNYToiWE1MX1BBUlNFX0VSUk9SIn0sYWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixNYToiRFVSQVRJT05fRVJST1IifSwkYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTWE6IkVNUFRZX1ZBU1QifSxlZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixNYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sYmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk1hOiJMT0FEX0VSUk9SIn0sZ2U6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE1hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTWE6Ik1FRElBRklMRV9FUlJPUiJ9LGNlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE1hOiJEVU1NWV9BRCJ9fSxGPXtjZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE1hOiJOT19BRFMifSxkZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTWE6Ik5PX01FRElBRklMRVMifSx2cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixNYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLnhrfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnVkPWM7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLmRqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5Xa3x8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1jO3RoaXMuWmQ9W107dGhpcy5XaD1bXTt0aGlzLmxmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLndwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5aaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5vcT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Gbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlpkLnB1c2goe3NyYzpkLGZyYW1lOmgsbm46ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMubGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5sZltjXTtkLnR5cGU9PT1hJiZkLmNsKHRoaXMuVmwoYSkpfX0sVmw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7eHE6ITAsd3E6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7bHE6InZpZGVvIixBcToianNDdXN0b20iLEJxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQ3E6MSxWcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxqbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuWmQubGVuZ3RoO2MrKylpZih0aGlzLlpkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuWmRbY10ubm47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsYyl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5qbShjKSx2ZW5kb3I6Y30pO3RoaXMub28oKX0sRm46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnZnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMudmcoYSxjKX0sdmc6ZnVuY3Rpb24oYSxjKXt0aGlzLmxmLnB1c2goe3R5cGU6YSwKY2w6Yyx1cTohMX0pfSxvbzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuRW18fChhLm5xKHthZFNlc3Npb25JZDplLlkoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnlxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5FbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLm5rfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLm9iPWEuYmgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlkoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk9hPXt9O3RoaXMud2c9ITE7dGhpcy5kYz1bXX1jLmJqPWE7YS5wcm90b3R5cGU9e09sOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuT2woYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLnJtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSx2bzpmdW5jdGlvbigpe3RoaXMud2c9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5FYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLndnfHwodGhpcy5jLnBsYXkoKSxlLm8oay5xZCx0aGlzLmMubCgpKSl9LEZmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLm9iLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5vYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5vYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLm9iLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMub2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMub2IpO3RoaXMuYy5VYyYmdGhpcy5jLlVjKCk/dGhpcy5jLmJoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0scm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxNbDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGtjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuTWwodGhpcy5vYik7aWYoYy54IT10aGlzLk9hLnh8fGMueSE9dGhpcy5PYS55fHxjLnBvc2l0aW9uIT10aGlzLk9hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk9hLndpZHRofHxjLmhlaWdodCE9dGhpcy5PYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5PYS53aWR0aCYmMDx0aGlzLk9hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuUGUoKTtyZXR1cm59dGhpcy5PYT1jO3RoaXMuYy5VYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmRjLmxlbmd0aDthKyspdGhpcy5kY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLktmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2MuYmluZCh0aGlzKSwxMCl9LHVnOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLmRjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5kYy5wdXNoKGEpfSxQZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5ianx8WWEsRD1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5ZKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMua2p8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuTWQoYSk7dGhpcy5NZygpfSxNZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sTWc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlRhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5UYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLlNqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLiRiPXRoaXMuJGJ8fCExO3RoaXMubWc9dGhpcy5vZz10aGlzLnVoPXRoaXMudmE9dGhpcy5QZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLktsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnVoJiZ0aGlzLkVnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuSWI7YSYmYS5tYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5vZCgpO3RoaXMudWg9ITA7dGhpcy5FZygpfS5iaW5kKHRoaXMpKTt0aGlzLkFnKCl9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3RoaXMub2QoKTtpZighdGhpcy5QZiYmIXRoaXMub2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlBmJiZ0aGlzLm1nJiYhdGhpcy5vZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKX19LG9kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5paCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxpaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sQWc6ZnVuY3Rpb24oKXtpZih0aGlzLm9kKCkpe3ZhciBhPXRoaXMuaWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5vZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLm1nPWEuU3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMDApfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5qcSgpOiExfSxJYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuSWMoKTotMX0sZG06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LEtsOmZ1bmN0aW9uKGEsYil7dGhpcy4kYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLiRifHwzMDI9PXRoaXMuJGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuJGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmlhKCkpOmEuVGUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5kbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Sanx8YmI7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxHbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5iay5Iay5Gaz93aW5kb3cuT08uYmsuSGsuRmsuUXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5NZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLlRqfHxjYixkYj1uZXcgY2IodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5sbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMubG58fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuZ2E9ITE7dGhpcy5saCgpfSxsaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5VKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LExhOmZ1bmN0aW9uKCl7dGhpcy5SaCgpfSxSaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuViYmKDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLlNpfHxmYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5pYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmlhKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkJnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuQmcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLlJpfHxnYjsoZnVuY3Rpb24oYyl7Yy5UaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5NZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5MbHx8KHRoaXMuTGw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYixUPW5ldyBoYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLkRsfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxVYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cuZ2QoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3LmdkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuam4oYSl9LmJpbmQodGhpcykpO3cuZ2QoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5nZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubW0oKX0sam46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5HZCYmKGE9ZS5BbChhLHRoaXMuR2QpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5NKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkYpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkdkfHwodGhpcy5HZD1bXSksdGhpcy5HZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5NKGQpfHwodGhpcy5OKGQpLGY9bmV3IFYoZCx0aGlzLkYpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZ2Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwKKHRoaXMuYmFbYV09e30pO3RoaXMuYmFbYV1bYl18fCh0aGlzLmJhW2FdW2JdPVtdKTt0aGlzLmJhW2FdW2JdLnB1c2goYyl9LEhvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYmF8fHRoaXMuYmEmJiF0aGlzLmJhW2JdKXRoaXMuUGN8fCh0aGlzLlBjPVtdKSx0aGlzLlBjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy52ZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxtbTpmdW5jdGlvbigpe2lmKHRoaXMuUGMpZm9yKHZhciBhPTA7YTx0aGlzLlBjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuUGNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5iYVtjXVtkXSYmMDx0aGlzLmJhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYmFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmJhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5IbyhhKX19KX0pKGMpO3ZhciBqYj1jLm1rfHxqYix3PW5ldyBqYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMudGt8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9pPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuT2l8fGxiOyhmdW5jdGlvbihjKXtjLlBpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLlBpfHxtYjsoZnVuY3Rpb24oYyl7Yy5RaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTShoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRikpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkthKWlmKGI9PXRoaXMuS2FbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuS2FbYS5qYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYixvYj1uZXcgbmIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5janx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5HZz10aGlzLkdjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnFsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFsPSEwKTt2YXIgYj10aGlzLlRnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5HYz1iKTtpZighdGhpcy5HZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5HZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuemQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlUoYik7dGhpcy5Fbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTt0aGlzLmZjLnB1c2goYSl9LHJsOmZ1bmN0aW9uKCl7aWYodGhpcy5mYyYmdGhpcy5mYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdHJ5e3RoaXMuZmNbYV0oKX1jYXRjaChiKXt9fSx6ZDpmdW5jdGlvbigpe2lmKHRoaXMuR2MpcmV0dXJuIHRoaXMuR2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuVGcoYSkpcmV0dXJuIHRoaXMuR2M9YX19LFRnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRW46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLm11dGUmJnRoaXMuZWEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sdmg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy5Qanx8cWI7KGZ1bmN0aW9uKGMpe2MuT2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm1hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS56ZCgpPwp0aGlzLkMoKToodGhpcy5FZXx8KHRoaXMuRWU9MSksdGhpcy5FZSsrLDEwMDx0aGlzLkVlP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuUWo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLk0oYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgc2I9Yy5Ranx8c2IsVz1uZXcgc2IodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVsPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHRiPWMuRWx8fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LExhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuemt8fHViOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEtjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxDbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuaWEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy56Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkNuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuS2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy56Yyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmZiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmZiW2JdJiYzMDMhPXRoaXMuZmJbYl0mJjQwMyE9dGhpcy5mYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuaWEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMueWt8fHZiOyhmdW5jdGlvbihjKXtjLkFrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5NKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuQWt8fHdiLHhiPW5ldyB3Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmFsfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5VKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMucGY9ITF9LExhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnRuKCl9LmJpbmQodGhpcyksNTAwKX0sdG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5WJiZ0aGlzLlYoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMucGYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMucGYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxybzpmdW5jdGlvbigpe3RoaXMucGY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLmdrfHx6YjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMucmM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5yY3x8KHRoaXMucmM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5yY3x8dGhpcy5yYysrLHRoaXMucmM8PXRoaXMuWG0/KHRoaXMucmMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnJvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQWI9Yy5ma3x8QWI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBCYj1jLmhrfHxCYixDYj1uZXcgQmIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRGI9Yy53anx8RGI7bmV3IERiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5WKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuZWt8fEViOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubWEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMudGwoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5FYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuTm0oKTp0aGlzLkRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sdGw6ZnVuY3Rpb24oKXt0aGlzLmtnKCl8fHRoaXMuaSghMCl9LE5tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYigpOyFhLnBhJiZhLlcmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxEZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5pYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LEViOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGgpZm9yKHZhciBhPWMuYWQuRWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTGg9YVtlXSk7cmV0dXJuIHRoaXMuTGh9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5FYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLmRrfHxGYjsoZnVuY3Rpb24oYyl7Yy5hZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGtsOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBGYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmFkLkViKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5rbChhW2JdKTt0aGlzLlAoKX19KTtjLmFkLkViPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobCYmbC5wbGF5ZXJhcGkmJihhPWwucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5hZHx8R2IsSGI9bmV3IEdiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5aaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuWml8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVShiKTp0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxpcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApVYzpmdW5jdGlvbigpe3JldHVybiEwfSxUYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5xZj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnFmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMucWYmJmMhPXRoaXMucWZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGUuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEucHEpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuZ2E/dGhpcy52ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxKYj1jLk1qfHxKYixLYj1uZXcgSmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Jaj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBMYj1jLklqfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlUoYikpOnRoaXMuWCgpKTp0aGlzLlgoKTp0aGlzLlgoKTp0aGlzLlgoKX0sYmk6ZnVuY3Rpb24oKXt9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGduOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE1iPWMubWp8fE1iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMueGUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5tYSgpfS5iaW5kKHRoaXMpKX0seGU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy54ZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgTmI9Yy5sanx8TmI7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuZ2F8fHRoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLm5qfHwKT2IsUGI9bmV3IE9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Jbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFiPWMuSW98fFFiO25ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVShiKSk6dGhpcy5YKCkpOnRoaXMuWCgpfSxiaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxnbjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBSYj1jLlZpfHxSYjsoZnVuY3Rpb24oYyl7Yy5XaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLnhlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmlhKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFNiPWMuV2l8fFNiOyhmdW5jdGlvbihjKXtjLlhpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgYz1uZXcgUmIoYVtiXSk7Yy5nYXx8dGhpcy5NKGMpfHwodGhpcy5OKGMpLHdpbmRvdy5icmlkcGxheWVyPWMsKG5ldyBTYihjLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiLFViPW5ldyBUYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLk5pfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPQpiLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5VKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWCgpfSxYZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sRG46ZnVuY3Rpb24oKXt0aGlzLlpjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWmN8fCh0aGlzLlpjPSEwLHRoaXMuWGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlpjJiYodGhpcy5YZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlpjPSExKSx0aGlzLlhkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHVhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgV2I9Yy5Ea3x8V2I7KGZ1bmN0aW9uKGMpe2MuQ2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sVmg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5lYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmVjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuZWMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLlZoLmJpbmQodGhpcyksMTApfSxlYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSWs9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuaSgpKToodGhpcy5Ja3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuaSgpKX0saGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuZWMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhnLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmgoKTt0aGlzLmhnKCk7dGhpcy5HbigpfSxHbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmVjKGEpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLkFuP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLkFuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuZWMoYSkpfX0pfSkoYyk7dmFyIFhiPWMuQ2t8fFhiOyhmdW5jdGlvbihjKXtjLkVrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFdiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5nYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGEuRG4oKSxhPW5ldyBYYihhLHRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgWWI9Yy5Fa3x8WWIsWmI9bmV3IFliKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMua249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciAkYj1jLmtufHwkYjtuZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5waz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLlBoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLmJuPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5YKCl9ZWxzZSB0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxiaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ibn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuVmQoYSl9LmJpbmQodGhpcykpfSxWZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5QaCYmKHRoaXMuUGg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgTj1jLnBrfHxOOyhmdW5jdGlvbihjKXtjLm9rPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5JZSlpZih0aGlzLktifHwKKHRoaXMuS2I9MCksdGhpcy5LYisrLDE1PHRoaXMuS2Ipe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuZW8oKTp0aGlzLmkoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuaSgpOnRoaXMuaSghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkllPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy50YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLkspLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHRiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLks9YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz0KcS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVmE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5nYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKSk7dGhpcy52ZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGFjPWMucWt8fGFjLGJjPW5ldyBhYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBjYz1jLk1pfHxjYztuZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Haj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLkdqfHxaOyhmdW5jdGlvbihjKXtjLkZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnJoPTA7dGhpcy5LPXRoaXMuS3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuTWM9dGhpcy5CYT10aGlzLmpkPSExO3RoaXMuVGg9ZS5PYigxMCk7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5wYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnZiKCksITA7dGhpcy5yaCsrO2lmKDEwPHRoaXMucmgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuaSghMCk6dGhpcy5pKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy56aC5iaW5kKHRoaXMpLDEwMCksITF9LHZiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmIoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnZhPQohMH0sY2E6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCk/KHRoaXMudygpLHRoaXMuaWEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Ganx8YWE7KGZ1bmN0aW9uKGMpe2MuSGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLAp0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5Ianx8ZGMsZWM9bmV3IGRjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMucmt8fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLApiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlUoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5YKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGdjPWMuaWp8fGdjOyhmdW5jdGlvbihjKXtjLmhqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLkNnKCl9LENnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgaGM9Yy5oanx8CmhjOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBnYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5nYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLk0oYSkpe3RoaXMuTihhKTsobmV3IGhjKGEsdGhpcy5GKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgaWM9Yy5qanx8aWMsamM9bmV3IGljKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMudW18fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5HaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5VKGEpOnRoaXMuWCgpKTp0aGlzLlgoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGxjPWMuR2l8fGxjOyhmdW5jdGlvbihjKXtjLkZpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLndlKCk7dGhpcy56ZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSx0YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxEYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LHpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChhPWEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmEuYWRzTG9hZGVyKWZvcih2YXIgYj0wO2I8YS5hZHNMb2FkZXIubGVuZ3RoO2IrKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMuaWEoKSk6dGhpcy5pKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy56Zy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLndlLmJpbmQodGhpcyksMTAwKX0sd2U6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuaSgpOnRoaXMuaSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy53ZS5iaW5kKHRoaXMpLDEwMCl9fSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWEuYmluZCh0aGlzKSwxRTQpO3RoaXMuQyhhKX19KX0pKGMpO3ZhciBtYz1jLkZpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFNhOmZ1bmN0aW9uKGEpe2E9Cm5ldyBsYyhhKTthLmdhP3RoaXMuUCgpOnRoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IG1jKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlNhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5TYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBuYz1jLkhpfHxuYyxvYz1uZXcgbmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGM9Yy5DbHx8cGM7bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkFoPXRoaXMuQ2g9dGhpcy5CaD0hMTt0aGlzLklkPVtdO3RoaXMudWY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHc/bnVsbDp3LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBaYj9udWxsOlpiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLEJyaWRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWI/bnVsbDpVYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEphP251bGw6SmEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9jP251bGw6b2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLiRqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuZW0oYSk6W10sYzt0aGlzLkNoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkJoPQohMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sdGhpcy5haShjKX1lbHNlIGZvcihkIGluIHRoaXMudWYpe2lmKHRoaXMuQWgpYnJlYWs7Yz10aGlzLnVmW2RdO3RoaXMuVGYoYykmJih0aGlzLklkLnB1c2goYyksdGhpcy5haShjKSl9fSxUZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHE/ITA6ITF9LGVtOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYztmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkPWFbZV0sZD10aGlzLnVmW2RdLHRoaXMuVGYoZCkmJmMucHVzaChkKTtyZXR1cm4gY30sYWk6ZnVuY3Rpb24oYSl7dGhpcy5UZihhKSYmYS5mKCl9LHRvOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiByJiYhdGhpcy5CaClmb3IodGhpcy5BaD0hMCxhPTA7YTx0aGlzLklkLmxlbmd0aDthKyspdGhpcy5JZFthXS5WYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLklkW2FdLlZiKX19fSkoYyk7dmFyIHFjPQpjLiRqfHxxYyxMPW5ldyBxYztMLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYz1jLlZtfHxyYztuZXcgcmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGE9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1hLmluZGV4T2YoImhvbWFkIil8fC0xIT1hLmluZGV4T2YoImhkLW1haW4iKSlhPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWEuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1hLnN1YnN0cmluZyhhLmluZGV4T2YoIjoiKSsxLGEuaW5kZXhPZigiaXMgbm90IiktCjEpLGUuSGMoay5SbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuSGMoay5mbiksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciB3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHVjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLGw9ITE7SC5mYSgpO0gud2goKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmZhKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC53aCgpLApmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtILmZhKCk7dmFyIHhjPXdjKGZ1bmN0aW9uKCl7ZS5XZyh3aW5kb3csSC53bSgpLHtpZDp4Y30pfSw1MDApLGlhPWUuWSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBzYz1jLkVqfHxzYztuZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUWg9dGhpcy5jb25mPXRoaXMuSGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkRkPTA7dGhpcy5lYj0iIjt0aGlzLkpkPVtdO3RoaXMuS2Q9MDt0aGlzLlNoPSExO3RoaXMucmY9W107ZS5yYigibmV3QWRkZWxpdmVyeSIpfWMuSWk9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5RaD1hfSxCZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYTt0aGlzLmViPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxXbjpmdW5jdGlvbihhKXt0aGlzLkhiPWF9LFZuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGN9LFZjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLnhtKCkpdGhpcy5IYi5nKHRoaXMuSGIuTGMsdGhpcy5IYi5xYSx0aGlzLkhiLnRmLGZ1bmN0aW9uKCl7dGhpcy5WYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuSGIuZ2MpO2Vsc2UgaWYodGhpcy5vbSgpKXRoaXMuU24oZnVuY3Rpb24oKXt0aGlzLlZjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5FYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPQpuZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLnZvKCk7bC5leGl0RnVsbHNjcmVlbigpO2UucmIoIm5ld0hvbWFkRGlzcGxheSIpO1E9bD1uZXcgUGEobCx0aGlzLkhiLGgpO2wuVG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLldtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWYmJihkPXRoaXMucGxheWVyLmFmKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLmNmKGEsZCxmKTt0aGlzLnBsYXllci5kaShsKX19LHhtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuRGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktCnRoaXMuRGQuZ2V0VGltZSgpLHRoaXMuRGQ9YSwzRTU8Yz8hMDohMTt0aGlzLkRkPWE7cmV0dXJuITF9LGxvOmZ1bmN0aW9uKCl7ZS5yYigicHJlcm9sbCIpO2UuQWYoInByZXJvbGwiKTt2YXIgYT10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkhhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5TZyhhKSk/dGhpcy5WYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLnFkLHRoaXMucGxheWVyLmwoKSkpfSxrbzpmdW5jdGlvbihhKXtpZighdGhpcy5RaCl7ZS5BZigicG9zdHJvbGwiKTtlLnJiKCJwb3N0cm9sbCIpO3RoaXMuJG4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkhhKCJwb3N0cm9sbEFkVGFnIikpOwooZD10aGlzLlNnKGQpKT90aGlzLlZjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnFkLHRoaXMucGxheWVyLmwoKSkpfX0sU2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LEpuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuaW8odGhpcy5rby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5MYSgpfSxPZDpmdW5jdGlvbihhKXtlLnJiKCJtaWRyb2xsIik7ZS5BZigibWlkcm9sbCIpO2lmKCF0aGlzLkZoKXt0aGlzLkZoPSEwO3ZhciBjPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSGEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlZjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLm8oay5xZCx0aGlzLnBsYXllci5sKCkpKX19LEluOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuWm4odGhpcy5PZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5mZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5sbygpO3RoaXMucGxheWVyLmZmJiZ0aGlzLkluKCk7dGhpcy5KbigpfSxLbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkpkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy50cChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLktkPXRoaXMuSmQubGVuZ3RofSxvbTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5LZCYmKGE9ITApO3JldHVybiBhfSxTbjpmdW5jdGlvbihhKXt0aGlzLlNoPWE7Zm9yKGE9MDthPHRoaXMuSmQubGVuZ3RoO2ErKyl0aGlzLkpkW2FdWyJmdW5jdGlvbiJdKHRoaXMueG4uYmluZCh0aGlzKSl9LHhuOmZ1bmN0aW9uKGEpe3RoaXMuS2QtLTthJiZ0aGlzLnJmLnB1c2goYSk7MD49dGhpcy5LZCYmdGhpcy5TaCgpfSxXbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5yZi5sZW5ndGg7ZCsrKWM9dGhpcy5yZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5JaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLllpfHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGt1aVNoaXNoV3VzaG9kb28sa3VpU2hpc2hXdXNob2Rvbyk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.213.75
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-143-204-213-75.fra53.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.giga.de/f64c4dcd1b81e1f7fc12758cddf26012ad64f32c/
Frame 7103
|
807 B
2 KB
|
166ms
86ms
|
XHR
application/json |
46.4.77.66
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.giga.de/f64c4dcd1b81e1f7fc12758cddf26012ad64f32c/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGt1aVNoaXNoV3VzaG9kb289a3VpU2hpc2hXdXNob2Rvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cubWZ8fCh3Lm1mPTApO3cubWYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5tZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZighbCl1YyhlYSw1MCk7ZWxzZSBpZighZS5wbil7bC5wYXVzZUJ1dHRvbnx8KGwucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLm11dGVCdXR0b258fChsLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbC5za2lwYWJsZUJ1dHRvbnx8KGwuc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTtsLnNraXBCdXR0b258fChsLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobC5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtsLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxtKX0pfW0uZyhsLmdsb2JhbENvbmZpZyxsLmNsaWVudENvbmZpZyxsLnByZWNoZWNrZWQsbC5vblJlYWR5LGwub25GYWlsdXJlLGwpO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPWwuc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHQoYyxhKXtpZihlLmJsKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkVjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP20uSWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZmE7Yi5CZihjKTtiLlduKG0pO2IuVm4obCk7Yi5LbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKG0ud2IubGVuZ3RoKXt2YXIgYj1tLndiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGc7Zz1lLmNvKHsiW0xPQURTQ1JJUFRdIjplLlkoMTApLCJbVVRJTFNdIjplLlkoMTApLCJbQ0FMTEJBQ0tdIjplLlkoMTApfSk7d2luZG93W2dbIltMT0FEU0NSSVBUXSJdXT1lLkRoLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBnIGluIGIpbFtnXT1iW2ddO3QoYyxhKX07Zz1iLnNjcmlwdHMuc2hpZnQoKTspZS5EaChnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxtKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmNrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5ibD0hMTt0aGlzLkpiPSJzZXR1cCI7dGhpcy5XYz1bXTt0aGlzLnplKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMud24uYmluZCh0aGlzKSk7dGhpcy5xYj17fTt0aGlzLnBoPXt9O3RoaXMueWY9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt1bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5xYlthXSsiXyIpO3JldHVybiBifSxqYzpmdW5jdGlvbigpe3RoaXMueWZ8fCh0aGlzLnlmPWUuWSgxMCkpO3JldHVybiB0aGlzLnlmfSxyYjpmdW5jdGlvbihiKXt0aGlzLnFiW2JdfHwodGhpcy5xYltiXT0wKTt0aGlzLnFiW2JdKz0xOzU8dGhpcy5xYltiXSYmIXRoaXMucGhbYl0mJih0aGlzLnBoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudW8oKSwhMCkpfSx6ZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFRrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGxhOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSx3bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy52bihiLmRhdGEpfSx2bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx1ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LExnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmVoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5FZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGVoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFJrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUuTmwoYikpcmV0dXJuOyhhPXRoaXMuTGcoYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE5sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxWZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sSW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sTWU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZGg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LGZvOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sRGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy54bChhKSxmPTA7ZjxkLmxlbmd0aDtmKyspdGhpcy5mbyhiLGRbZl0ua2V5LGRbZl0udmFsdWUpfSxkbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0seGw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9mPWNbMV0udHJpbSgpOmY9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLmRsKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpmfTthLnB1c2goZCl9cmV0dXJuIGF9LEtmOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHloOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFZlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxmPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2Y9aC5oZWlnaHQ7MD5oLnRvcCYmKGYrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZik7Yz49YSYmKGU9ITApO3JldHVybiBlfSxXZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlZlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldlKGIpfS5iaW5kKHRoaXMpLDEwMCl9LE9iOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxPZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZjtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylmPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2YsYXw9MDtyZXR1cm4gYX0sRWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWI+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBmLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx4PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1iLmNoYXJDb2RlQXQoZik8PDI0fGIuY2hhckNvZGVBdChmKzEpPDwxNnxiLmNoYXJDb2RlQXQoZisyKTw8OHxiLmNoYXJDb2RlQXQoZiszKSxyLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZik7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cltiKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWg7bD14O3k9azt0PW07Zm9yKGY9MDsxOT49ZjtmKyspcT1kKHAsNSkrKG4mbHx+biZ5KSt0K2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7Zm9yKGY9MjA7Mzk+PWY7ZisrKXE9ZChwLDUpKyhuXmxeeSkrdCtjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1sLGw9ZChuLDMwKSxuPXAscD1xO2ZvcihmPTQwOzU5Pj1mO2YrKylxPWQocCw1KSsobiZsfG4meXxsJnkpK3QrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bCxsPWQobiwzMCksbj1wLHA9cTtmb3IoZj02MDs3OT49ZjtmKyspcT1kKHAsNSkrKG5ebF55KSt0K2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3g9eCtsJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeCkrYShrKSthKG0pKS50b0xvd2VyQ2FzZSgpfSxDYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxmLHAsYyxlLGgseD0wO3g8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHgrKyksZj1iLmNoYXJDb2RlQXQoeCsrKSxwPWIuY2hhckNvZGVBdCh4KyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZik/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx2ZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGg9ITEseD0hMSxrPSExLGw9ITE7dHJ5e2E9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuZGM/ITA6ITF9Y2F0Y2godCl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSx4PSFoJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0oa3x8cCkmJiEhd2luZG93LkNTU31jYXRjaChxKXt9Yi5pc1BoYW50b21KUz1hO2IuaXNDaHJvbWVIZWFkbGVzcz1kO2IuaXNGaXJlZm94SGVhZGxlc3M9ZjtiLmlzT3BlcmE9cDtiLmlzRmlyZWZveD1jO2IuaXNTYWZhcmk9ZTtiLmlzSUU9aDtiLmlzRWRnZT14O2IuaXNDaHJvbWU9aztiLmlzQmxpbms9bDtyZXR1cm4gYn0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj17S2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCnNtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LFVqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxKajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LGprOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sWWs6ZnVuY3Rpb24oKXtyZXR1cm4gYi5LaSgpfHxiLlVpKCl8fGIuc20oKXx8Yi5VaigpfHxiLkJrKCl8fGIuSmooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuWWsoKX0sU2w6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGY9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZlsxXSkpcmV0dXJuIGQ9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhhKXx8W10sIklFICIrKGRbMV18fCIiKTtpZigiQ2hyb21lIj09PWZbMV0mJihkPWEubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1kKSlyZXR1cm4gZC5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtpZighYilyZXR1cm4gZlsxXTtmPWZbMl0/W2ZbMV0sZlsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShkPWEubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZi5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBmLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFthW2ZdXT1iW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxnKXthJiYoZC5xdWVyeUtleVthXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZj0wLHA9Yi5sZW5ndGg7ZjxwOysrZilhLmhhc093blByb3BlcnR5KGJbZl0pfHwoZC5wdXNoKGJbZl0pLGFbYltmXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sZm06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxmLnB1c2goYltwXSk7cmV0dXJuIGZ9LG1vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZj0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhmPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmYpOihkPWIuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LFpnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEFmOmZ1bmN0aW9uKGIpe3RoaXMuSmI9Yn0sV2c6ZnVuY3Rpb24oYixhLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5KYjt0aGlzLnJlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsCmQpKSxiLmRpc3BhdGNoRXZlbnQoZil9Y2F0Y2gocCl7dGhpcy5wbj0hMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEhjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5XZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHo9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih6PWsuU2EoYixhKSk7ZiYmKHo9ay5TYSh6LGYpKTtwJiYoej1rLlNhKHoscCkpO2MmJih6PWsuU2EoeixjKSk7aCYmKHo9ay5TYSh6LGMpKTtlLkhjKHopfSx5bjpmdW5jdGlvbihiKXt2YXIgYT17fTsKaWYoIWIuY29kZSlyZXR1cm4hMTtpZihiLnNwZWNpYWxfdHJhY2t8fGIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmZtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPQpiLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LG5vOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5qYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMucmUoYil9LHJlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMueW4oYik7aWYoYSlpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uU2MoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjsKYi5kYXRhLmhvbWFkX2F0PWE7bS5KYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGY9bS5TYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5KYShmLGZ1bmN0aW9uKGQpe3ZhciBmPQohMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxXZDpmdW5jdGlvbihiKXtpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGEsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uU2MoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLkphKGIpfX0sZGY6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uamwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGYoKX0uYmluZCh0aGlzKSwKNTAwKX0sS2U6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnBiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxOZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0scGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5BZChiKToiIn0sQWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5OZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHhnOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5YZShiKXx8dGhpcy5JbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LndmJiZ3aW5kb3cuc2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5WZyhiKSlyZXR1cm4gdGhpcy5WZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQ2IoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPQohMTtkPSExO2Q9dGhpcy5iYihiLGEuQWEsYyxmdW5jdGlvbihiKXtlPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWEuQ2QoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUmsoZSxiKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYixhLGQsZixjLGUsaCx6KXt2YXIgaz1lfHxtO2U9ITA7eiYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWUuZGF0YVt0XT1kW3RdO3JldHVybiBrLkphKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmIoYixhLGQsZixjLGssaCx6KX0uYmluZCh0aGlzKSw1MDApfSxFZDpmdW5jdGlvbihiLGEsZCxmLGMsZSxoKXt2YXIgaz0hMDtoJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIHggaW4gaClkKz0iJiIreCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbeF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUm06ZnVuY3Rpb24oYixhLGQpe3RoaXMuRWQoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuV2MpZm9yKHZhciBjIGluIHRoaXMuV2MpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5XY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuQ2IoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxEaDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkNiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5iYihiLGYuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlJtKGYuQ2QoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LGNvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLldjPWJ9LHRwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5iYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxaazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LEJtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylpZihhW2ZdPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnBqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZW49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuRmw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnFnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmlnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5uZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5yZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSms9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLmxnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuV289e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmRuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkdsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5xcD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnZsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEucWQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5FYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EucGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkxrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5mZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Eub2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EucWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLktrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5obj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkZkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlFmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5JZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuUm89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5mbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLklsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e09lOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZixjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBNYXRoLmFicyhhKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk9hfHwieCIpfSxibTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuT2F8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHlkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy55ZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLnlkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5PZSh0aGlzLmphKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMueWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHdtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHdoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLk9lKHRoaXMuYm0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy55ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnZqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChnW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5nP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy50bXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5LYT17fTt0aGlzLkY9bnVsbDt0aGlzLlRjPTEwMDt0aGlzLlBiPTA7dGhpcy5WYT0xNTA7dGhpcy5WYj0wO3RoaXMuWG4oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlBiPD10aGlzLlZhPyh0aGlzLlBiKyssdGhpcy5WYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlRjKSk6MD50aGlzLlZhJiYodGhpcy5WYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlRjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGI+dGhpcy5WYT8hMDohMX0sdmY6ZnVuY3Rpb24oKXt0aGlzLlBiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuS2FbYS5qYSgpXT0KYTtMJiZMLkNoJiZMLnRvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBlLk1lKHRoaXMuS2EpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLkthKWlmKGI9PXRoaXMuS2FbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuS2FbYS5qYSgpXT8hMDohMX0sQ206ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuS2EpaWYoYS5pZD09dGhpcy5LYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx0cTpmdW5jdGlvbihhKXt0aGlzLkthW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLlpqfHxxOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuVGM9MTA7dGhpcy5QYj0wO3RoaXMuVmE9NTA7dGhpcy5WPW51bGw7dGhpcy5nYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuSWI9IiI7dGhpcy5OZz0hMTt0aGlzLkooKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGc9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZylhLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxMYTpmdW5jdGlvbigpe30saW86ZnVuY3Rpb24oYSl7dGhpcy5WPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVn0sWm46ZnVuY3Rpb24oYSl7dGhpcy5nZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdmfSxmZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuUGI8PXRoaXMuVmEmJih0aGlzLlBiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5UYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sTWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx2cTpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk5rKCk7dGhpcy5NZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxOazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5ZKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFRlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYX0sWDpmdW5jdGlvbigpe3RoaXMuZ2E9ITB9LFVjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxhZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLkliPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5JYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuSWImJihhPSEwKTtyZXR1cm4gYX0scXE6ZnVuY3Rpb24oKXt0aGlzLk5nfHwodGhpcy5OZz0hMCl9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5KaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmZnPSIxIjt0aGlzLmdnPSIyIjt0aGlzLkdrPSIzIjt0aGlzLmJkPTA7dGhpcy5abT0zMDt0aGlzLlpiPVtdO3RoaXMua2I9W107dGhpcy50Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5zZz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuYmQ7dGhpcy5pZD1lLlkoMTApO3RoaXMuQmYoYSk7dGhpcy5ZbihiKX0sZjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxlLmRmKCkpfSxKaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEubWMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmphKCldfHwod2luZG93W2IuZmEoKV1bYS5qYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmphKCldLmluaXRpYXRvcj1lLmpjKCkpO3dpbmRvd1tiLmZhKCldW2EuamEoKV1bZS5qYygpXT93aW5kb3dbYi5mYSgpXVthLmphKCldW2UuamMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmphKCldW2UuamMoKV09MX0sem06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSTt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5qYSgpXSYmd2luZG93W2cuZmEoKV1bYS5qYSgpXS5pbml0aWF0b3IhPWUuamMoKSYmKHRoaXMuQ2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnZtKCk7CmlmKCF0aGlzLnptKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkNmKCk7cmV0dXJufXRoaXMuQ2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxnKTt0aGlzLnBpKCk7dGhpcy5zZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5aYi5wdXNoKGEpLHRoaXMua2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5aYiYmMDx0aGlzLlpiLmxlbmd0aCYmKHRoaXMuWmI9ZS51bmlxdWUodGhpcy5aYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWmIuam9pbigiLCIpKSk7aWYodGhpcy5rYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmtiLmxlbmd0aDtnKyspdGhpcy50Y1t0aGlzLmtiW2ddLnJlYXNvbl09PXRoaXMudGNbYV0mJmIucHVzaCh0aGlzLmtiW2ddLmRldGFpbCksdGhpcy50Y1t0aGlzLmtiW2ddLnJlYXNvbl08CnRoaXMudGNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmtiW2ddLmRldGFpbCksYT10aGlzLmtiW2ddLnJlYXNvbik7dGhpcy50Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihnPWUudW5pcXVlKGIpLGE9YSsiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmZnfSxDZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuZ2d9LGVvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ha30sbWE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkfSxrZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5mZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuZ2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmJkfSxCZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxZbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuSml8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5ybnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuZWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVShhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZWp8fG9hOyhmdW5jdGlvbihjKXtjLmZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmZqfHxwYTsoZnVuY3Rpb24oYyl7Yy5naj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuZ2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkJsfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm1oPXRoaXMuc2I9ITE7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubWg9ITApO3RoaXMuTWg9ITE7dGhpcy5VZygpO3RoaXMuSGUoKTt0aGlzLnVsPSExfSxVZzpmdW5jdGlvbigpe3RoaXMuc2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnNiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk1oPWE7aWYodGhpcy5taCl7dGhpcy5IZSgpO2lmKHRoaXMuc2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxIZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNiKXt2YXIgYT10aGlzLk1oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMuc2I9ITApO3RoaXMuVShiKX19LExhOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuT2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLk9kKGIpfS5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmdmJiYoMCx0aGlzLmdmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LEplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Canx8c2E7KGZ1bmN0aW9uKGMpe2MuQWo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG1hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5iZDt0aGlzLmlzUGxheWluZz10aGlzLm5lPSExO3RoaXMucGU9MTt0aGlzLmNkPVtdO3RoaXMuQmI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLm5lPSExO3RoaXMucGU9MTt0aGlzLmNkPVtdO3RoaXMuQmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5wZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkJiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGc9MDtnPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2crKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ddLnRhZyl7dGhpcy5CYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkJiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkJiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuQmI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPApkLmxlbmd0aDtnKyspYS5vbihkW2ddLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZ10mJih0aGlzLm5lPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZ10mJnRoaXMuSmgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5abSYmIXRoaXMuemEoKSYmKHRoaXMuQmI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubWEoKSx0aGlzLmdldFBsYXllcigpLnVsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuSWI7YiYmKGIuSGQoKSxiLnJkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5jZC5pbmRleE9mKGIpJiZ0aGlzLmNkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuaWEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5jZC5sZW5ndGg+PXRoaXMucGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5HZT90aGlzLkdlKys6dGhpcy5HZT0xOnRoaXMuRmU/CnRoaXMuRmUrKzp0aGlzLkZlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLktmKGIudmlkZW9UYWcpP2Iuc2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5uZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuRmU+dGhpcy5HZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlVnKCksYi5IZSgpLGIuc2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Banx8dGE7KGZ1bmN0aW9uKGMpe2MuQ2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5XbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpnLnNifHx0aGlzLk0oZyl8fHRoaXMuQ20oZyl8fCh0aGlzLk4oZyksZz1uZXcgdGEoZyx0aGlzLkYpLGcuSigpLGcuZigpKX19dGhpcy5QKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxXbDpmdW5jdGlvbigpe3ZhciBhPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQ2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLk1tfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOnRoaXMuWCgpKTp0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuVmQoYSl9LmJpbmQodGhpcykpfSxWZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5WJiZ0aGlzLlYoKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGcpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnZrfHx4YTsoZnVuY3Rpb24oYyl7Yy51az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuTWM9dGhpcy5CYT10aGlzLmpkPSExO3RoaXMuVGg9ZS5PYigxMCk7dGhpcy5SZj0hMDt0aGlzLnpjPXRoaXMudGg9ITE7dGhpcy5jbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSWgoKSx0aGlzLmZsKCksdGhpcy52YigpKX0sY246ZnVuY3Rpb24oYSl7cmV0dXJuIGUuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxycTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuamEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlcsIjsiLHR5cGVvZiBhLlcsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVz9hLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlc/dHlwZW9mIGEuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5HYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5HYT9hLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkdhP3R5cGVvZiBhLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5HYT9hLkcuR2EoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLkdhP3R5cGVvZiBhLkcuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5sZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmxlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEubWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5tZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS52ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS52ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcudmU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy52ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApLYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLkpjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sZ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5NYyl7dmFyIGE9dGhpcy5KYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLk1jPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5NYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLk1jfSxBbTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoKXt2YXIgYT10aGlzLkpjKCksYj10aGlzLnltKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuc2g9ITApfXJldHVybiB0aGlzLnNofSx5bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuamQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmpkPSEwKTtyZXR1cm4gdGhpcy5qZH0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuSG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sSG46ZnVuY3Rpb24oKXt0aGlzLnpjPSEwO3ZhciBhPXRoaXMuZ2goKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5IKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5BYz0hMDtlLkgoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuQWM9ITA7aWYoZS5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuQWM9ITA7ZS5IKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5BYz0hMDtlLkgoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkFjPSEwO2UuSCgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuS2cmJmEuYWRzJiYodGhpcy5LZz1hLmFkcyk7cmV0dXJuIHRoaXMuS2d9LGZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5tYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5KaCgpfS5iaW5kKHRoaXMpKX0sdGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuSWEmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmdoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRkKCl9LmJpbmQodGhpcyksNTApKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQW0oKSl7dmFyIGI9dGhpcy5KYygpLGc9dGhpcy5LYygpO2ImJmcmJih0aGlzLnpjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudGg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkpjKCksYT10aGlzLktjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnRoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmCmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGdsOmZ1bmN0aW9uKCl7dGhpcy5GY3x8KHRoaXMuRmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkZjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuRmM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuRmMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5GYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2woKX0uYmluZCh0aGlzKSwxMCl9LAp0YjpmdW5jdGlvbigpe3JldHVybiBlLkRlPyExOnRoaXMudmF9LERhOmZ1bmN0aW9uKCl7aWYodGhpcy5xbSgpKXt0aGlzLnZhPSEwO2lmKGUuSCgiZ2lnYS5kZSIpfHxlLkgoInNwaWVsZXRpcHBzLmRlIil8fGUuSCgia2luby5kZSIpfHxlLkgoImRlc2lyZWQuZGUiKSl0aGlzLlJmPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scW06ZnVuY3Rpb24oKXtpZigwPD1lLlVhKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZS5IKCJnaWdhLmRlIil8fGUuSCgic3BpZWxldGlwcHMuZGUiKXx8ZS5IKCJraW5vLmRlIil8fGUuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkVkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuU2woKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLkRlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpPyh0aGlzLncoKSx0aGlzLmlhKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlJmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlJmLGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxvbDpmdW5jdGlvbigpe3RoaXMuaHF8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2woKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy51a3x8eWE7KGZ1bmN0aW9uKGMpe2Mud2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2ddKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLk1lKGIpKXthPWI7Zm9yKHZhciBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGI9bmV3IHhhKGFbZ10pLGIuZ2F8fHRoaXMuTShiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5UYyl9fSl9KShjKTsKdmFyIHphPWMud2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLk5qfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5mPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5YKCk7cmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8CihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLlgoKX0sc246ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JYixnPXRoaXMuamEoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIubWMmJigwPD1nLmluZGV4T2YoZCl8fGIuSGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLm5mPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sdWE6ZnVuY3Rpb24oKXt0aGlzLm5mKys7aWYoMTA8dGhpcy5uZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LExhOmZ1bmN0aW9uKCl7fSxWZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7CnZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5JZSlpZih0aGlzLktifHwodGhpcy5LYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLktiKyssMTU8dGhpcy5LYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLkllPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy50YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLkspLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx0YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZz0hMDtnfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBnfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLkJhKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5KbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkpsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Euc24oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiYKd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBSKGFbYl0pO2cuZ2F8fHRoaXMuTShnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy5Cbnx8RmE7bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLmRoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudW49YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLnVuKXtjYXNlICJiZWZvcmUiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZywKYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVShnKTt0aGlzLndkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy53ZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMud2QpfSxrYTpmdW5jdGlvbigpe3JldHVybiEwfSxubDpmdW5jdGlvbigpe2UueWgodGhpcy53ZCk7ZS5WZSh0aGlzLndkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sYWY6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBHYT1jLnlqfHxHYTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLApiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIEhhPWMueGp8fEhhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLmRoKGEsImVsZW1lbnRJRCIpO2lmKGUueWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5NKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuVmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuVmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhLEphPW5ldyBJYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBLYT0KYy5Eanx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnNqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sT2s6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy5zanx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCxmLGMpe3RoaXMuRWE9Yjt0aGlzLllnPXRoaXMuRWk9ITE7dGhpcy5LaD1kO3RoaXMuaWk9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuRWE9bmV3IEMoYikpO3ZhciBoPQp0aGlzLmpiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbSYmbS5ZZSh0aGlzLkVhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2YmJjQhPWgucmVhZHlTdGF0ZSYmZihoKX0uYmluZCh0aGlzKX1jLnRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBiKXt2YXIgYT1iLGI9IiIsZDtmb3IoZCBpbiBhKWIrPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLllnJiYoYis9CiImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5qYi51cmxDYWxsZWQ9dGhpcy5FYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5qYi5vcGVuKHRoaXMuRWEubWV0aG9kLHRoaXMuRWEudXJsLCExKTp0aGlzLmpiLm9wZW4odGhpcy5FYS5tZXRob2QsdGhpcy5FYS51cmwsITApLHRoaXMuRWl8fCh0aGlzLmpiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5qYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5qYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5qYi5zZW5kKGIpfWNhdGNoKGYpe2I9dGhpcy5FYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8dGhpcy5FYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpLG0mJm0uWWUodGhpcy5FYS51cmwpJiYKIWI/ZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOm0uWWUodGhpcy5FYS51cmwpLHRoaXMuS2gmJnRoaXMuS2goKX1yZXR1cm4gdGhpcy5qYn19fSkoYyk7dmFyIExhPWMudGp8fExhOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5GYT10aGlzLmllPSExfWMuYWo9YTthLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxhbzpmdW5jdGlvbihiKXt0aGlzLkZhPWJ9LE1uOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3hwOiJBZENsaWNrVGhydSIsenA6IkFkRXJyb3IiLEFwOiJBZFN0b3BwZWQiLERwOiJBZExpbmVhckNoYW5nZSIsRXA6IkFkVGFnUGFyc2VkIixIcDoiQWRWaWRlb0NvbXBsZXRlIixLcDoiQWRMb2FkZWQiLExwOiJBZFNraXBwZWQiLE1wOiJBZFN0YXJ0ZWQiLEJwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsQ3A6IkFkSW1wcmVzc2lvbiIsCnlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLmllLGFbZF0pfSxMbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuRmEmJnRoaXMuRmEuaGUpZm9yKHZhciBhIGluIHRoaXMuRmEuaGUpdGhpcy5GYS5oZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkZhLHRoaXMuRmEuaGVbYV0pO3RoaXMuRmEmJnRoaXMuRmEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuRmEuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmllJiYKdGhpcy5NbigpO3RoaXMuRmEmJnRoaXMuTG4oKX19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5JYT0hMTt0aGlzLmJjPSIiO3RoaXMua2Q9dGhpcy5hYz10aGlzLmxiPW51bGw7dGhpcy5RZz10aGlzLndiPXRoaXMuJGU9ITE7dGhpcy5BYT0iIjt0aGlzLlplPSExO3RoaXMucWE9dGhpcy5MYz0iIjt0aGlzLlVlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnRmPSExO3RoaXMuaGE9W107dGhpcy5RZT10aGlzLlJiPSIiO3RoaXMuZmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5lZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMueWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuWWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuU2I9IiI7dGhpcy5UYj1bXTt0aGlzLlViPVtdO3RoaXMuWGM9W107CnRoaXMucWM9IiI7dGhpcy5EYj0hMTt0aGlzLlVkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubGM9ITE7dGhpcy5GZz10aGlzLiRkPW51bGw7dGhpcy5HZj10aGlzLmhiPXRoaXMuUGc9dGhpcy5ZZD10aGlzLlNmPXRoaXMubWQ9dGhpcy51Yz0hMTt0aGlzLiRhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkJkPTA7dGhpcy5vaD0hMTt0aGlzLm5oPTFFMzt0aGlzLkJjPSExO3RoaXMuUGE9MUUzO3RoaXMuZGQ9dGhpcy5lZD0iIn1jLnVqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLklhLGFkdGFncGFyYW1ldGVyOnRoaXMuYmMsYWR0YWdtb2RpZmllcjp0aGlzLmxiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5hYyxhZHRhZ3JlZ2V4OnRoaXMua2QsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuJGUsc2lkZWxvYWRzOnRoaXMud2IsZGlzYWJsZXRlc3RzOnRoaXMuUWcsaG9tYWRBbGlhczp0aGlzLkFhLAppc0luaXRpYWxpemVkOnRoaXMuWmUsZ2xvYmFsQ29uZmlnOnRoaXMuTGMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLlVlLHNlcnZlcjp0aGlzLmhhLHN2bUNvbmZpZzp0aGlzLlJiLGhvbWFkQWRwYXRoOnRoaXMuUWUsSE9NQURfVkVSSUZJRUQ6dGhpcy5mZSxIT01BRF9CTE9DS0VEOnRoaXMuZWUsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMuWWIsdGVzdEhpZGU6dGhpcy5TYix0ZXN0VGFnczp0aGlzLlRiLHRlc3RUYWdzSlM6dGhpcy5VYix0ZXN0VGFnc1hIUjp0aGlzLlhjLHRlc3QzUENvb2tpZTp0aGlzLnFjLHRocm90dGxlOnRoaXMuVWQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5sYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkZnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMudWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1kLAp1c2VTdHJpY3RDaGVja3M6dGhpcy5TZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5ZZCxjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy55YSxzZXJ2ZXJJZDp0aGlzLnhmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5hYix2cGFpZDp0aGlzLmhiLHNraXBBbGxvd2VkOnRoaXMuR2Ysdm1hcHM6dGhpcy5YZixhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuQmMsYWRGYWxsYmFja1VSTDp0aGlzLmVkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5kZH19LFVuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLklhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLmJjPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMubGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYKKHRoaXMuYWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5rZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLiRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy53Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlFnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5aZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5MYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlVlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaGE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5SYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuUWU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuZmU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5lZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYKKHRoaXMueWI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5ZYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuU2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuVGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5VYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlhjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5xYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuVWQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmxjPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLkZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnVjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMubWQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuU2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5ZZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuJGE9Yi5jb25maWdGYWlsdXJlcyk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy54Zj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmFiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuaGI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuR2Y9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuWGY9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5CYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuZWQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5kZD1iLmFkRmFsbGJhY2tDb25maWcpfSxubTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2FdJiYxPT10aGlzLiRhW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LHpmOmZ1bmN0aW9uKGIpe3RoaXMuJGFbYl09ITB9LFhsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYV0mJjE9PXRoaXMuJGFbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sU2Q6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKYj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk9iKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWUuWmsoYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZj0iIixjPSIiLGU9IiIsaD0iIjtpZighdGhpcy5JYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2Y9dGhpcy5YZShiKTtjPXRoaXMuYWEoYik7Zj8odGhpcy5OYygpP2U9YjplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5TYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLmJjfHx0aGlzLmxifHx0aGlzLmFjfHx0aGlzLmtkKSYmKGg9dGhpcy5hbihoKSk7Yj1uZXcgQyhlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKToKdGhpcy5abChjLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5DYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LFhlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5OYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaGEmJnRoaXMuaGEubGVuZ3RoJiYwPHRoaXMuaGEubGVuZ3RoJiYoYT10aGlzLmhhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsCiIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxZZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLlhlKGIpO3JldHVybiBhfSxabDpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LENkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFbdGhpcy54Zl19LFNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DZCgpLGE9dGhpcy5FZigobmV3IERhdGUpLmdldFRpbWUoKSsKIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sR2g6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sJG06ZnVuY3Rpb24oYixhKXt2YXIgZD1lLmFhKGIpLGY9IiIsZj0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxCPTA7QjxoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy5HaChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pOwpoPVtdO2ZvcihsIGluIGYpaC5wdXNoKGwrIj0iK2ZbbF0pO2Y9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZj10aGlzLkdoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYW46ZnVuY3Rpb24oYil7dGhpcy5iYyYmKGIrPXRoaXMuYmMpO2lmKHRoaXMubGIpZm9yKHZhciBhIGluIHRoaXMubGIpdGhpcy5sYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5sYlthXSkpO3RoaXMuYWMmJihiPXRoaXMuJG0oYix0aGlzLmFjKSk7cmV0dXJuIGJ9LG1sOmZ1bmN0aW9uKCl7dGhpcy55YSYmdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLmhsKHRoaXMueWEuY2xpZW50QVBJcyl9LGhsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmCmEuYm8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmFvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZixjLGUpe209dGhpczt0aGlzLlplPSEwO3RoaXMuTGM9Yjt0aGlzLnFhPWE7dGhpcy50Zj1kO3RoaXMuJGQ9Zjt0aGlzLmdjPWM7dGhpcy55YT1lfHx7fTt0aGlzLm1sKCk7dGhpcy5RbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLk9tKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkRjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuRGMoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sdWI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxRbTpmdW5jdGlvbigpe3RoaXMuSmEobmV3IEModGhpcy5MYyt0aGlzLnRlKCJnbG9iYWwiKSksdGhpcy5sbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy56ZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkRjKCl9LmJpbmQodGhpcyksITApfSxPbTpmdW5jdGlvbigpe3RoaXMuSmEobmV3IEModGhpcy5xYSt0aGlzLnRlKCJjbGllbnQiLC0xIT10aGlzLnFhLmluZGV4T2YoIj8iKSkpLHRoaXMuRGMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuemYoImNsaWVudCIpO3RoaXMuc2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LHRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ7ZD0oYT8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5PYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYKKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5tZCl7dGhpcy5tZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZyl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTsKZm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5nYz0hMSk7ImZvY3VzLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuZ2M9ITEpO3RoaXMuZ2MmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5nYz90aGlzLmdjKCk6KGEoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYSw1MDApKTt0aGlzLlM9dGhpcy5VZT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy5lZSkpO3RoaXMuV2IoKTtlLkhjKGsucW4pOyhhPWUuVWEodGhpcy5DZCgpKSl8fChhPWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpOwpifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxsbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZj0hMTt0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGY9ITApfWNhdGNoKGgpe31pZighKGZ8fGEuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUmJ8fAp0aGlzLkFhfHx0aGlzLkRjKCk6KHRoaXMuSWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy5XYigpKX19LERjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7dHJ5e3ZhciBjPWUuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihhPSEwKX1jYXRjaChoKXt9Yz1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8ZC5zZXJ2ZXIubGVuZ3RoO2IrKyl7dmFyIGE9ZC5zZXJ2ZXJbYl07dHJ5e3ZhciBnOyhnPXZvaWQgMD09PWEpfHwoZz0hYS5yZXBsYWNlKCJbaGFzaF0iLHRoaXMuRWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSkpO2lmKGcpcmV0dXJuITF9Y2F0Y2goZil7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmhhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5oYS5sZW5ndGg7YisrKXRoaXMuaGFbYl09dGhpcy5oYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuSCgid2ViLmRlIil8fGUuSCgiZ214Lm5ldCIpfHxlLkgoImdteC5hdCIpfHwKZS5IKCJnbXguY2giKXx8ZS5IKCIxdW5kMS5kZSIpKSYmIXRoaXMuTmMoKSlmb3IoYj0wO2I8dGhpcy5oYS5sZW5ndGg7YisrKXRoaXMuaGFbYl09dGhpcy5oYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5kZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5SYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuUWU9ZC5hZHBhdGh8fCIiO3RoaXMueGY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuaGEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5SYiYmdGhpcy5BYSYmdGhpcy5oYS5sZW5ndGg/dGhpcy5PYyghMSk6KHRoaXMuSWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy5XYigpKX0sY2k6ZnVuY3Rpb24oYil7dGhpcy5lZHx8KHRoaXMuZWQ9Ynx8CiIiKX0sT2M6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEModGhpcy5TYygpKSxkPXRoaXMuYWEodGhpcy5SYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQyh0aGlzLlJiK3RoaXMudGUoImN1c3RvbWVyIikpO3RoaXMuSmEoYSx0aGlzLndvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnpmKCJjdXN0b21lciIpO2I/dGhpcy5paz90aGlzLnNhKCJub1NWTUNvbmZpZyIpOih0aGlzLmlrPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5PYyghMCl9LmJpbmQodGhpcyksITApfX0sd286ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9CmIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5sYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubGM9ITA7dGhpcy5PYyghMCk7cmV0dXJufX1hPSExO3RyeXt2YXIgYz1lLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWlmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiYoZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGhpZGUiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFncyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzanMiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc3hociIpKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLlNmPXRoaXMuZ2IoZC5zdHJpY3QpO3RoaXMuWWQ9dGhpcy5nYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7CnRoaXMuUGc9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmFiPXRoaXMuZ2IoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmdiKGQuZW5hYmxlZCk7dGhpcy5TYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlViPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWGM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnFjPWQudGVzdDNwY29va2llfHwiIjt0aGlzLmJjPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMubGI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuYWM9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmtkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLiRlPWQuanNwb3B1cHN8fCExO3RoaXMud2I9ZC5zaWRlbG9hZHN8fCExO3RoaXMuaGI9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLmhiO3RoaXMuR2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5uZD1kLmNhcHRpb25fZHVyYXRpb258fAohMTt0aGlzLlhmPWQudm1hcHN8fCIiO3RoaXMuQmM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmRkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlVkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMubGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmxjPSEwLHRoaXMuT2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuSm8oKSYmKHRoaXMuU2J8fHRoaXMuVWJ8fHRoaXMuVGJ8fHRoaXMuWGMpP3RoaXMudGY/KHRoaXMuSWE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy55ZSgpLHRoaXMuV2IoKSk6dGhpcy56bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLk9mKCkpfX0sem86ZnVuY3Rpb24oKXt0aGlzLnlvKCk7dGhpcy5BbygpfSxBbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5ZKDEwKSxoPWUuWSgxMCksQj1lLlkoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQ2IoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS52ZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLkNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLnNhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxPZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuV2IoKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy51Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5JYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIoYikpLHRoaXMuV2IoKSx0aGlzLnllKCkpfSx5bzpmdW5jdGlvbigpe2lmKHRoaXMuU2Ipe3ZhciBiPWUudmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLkZtKCkpdGhpcy5UZCh0aGlzLlliLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuU2IpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5TYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlRkKHRoaXMuWWIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmxpKCl9fWVsc2UgdGhpcy5saSgpfSxNZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuT2IoKSksCnRoaXMuRG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLkxmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLkxmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlRkKHRoaXMuWWIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5UYj10aGlzLlhjKSYmdGhpcy5UYi5sZW5ndGgpe3ZhciBkPXRoaXMuVGIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5MZigpfSxEbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5KYShuZXcgQyhiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5PYigpKSx0aGlzLkVvKGYsMDxkLmxlbmd0aD9iLmJpbmQodGhpcyk6dGhpcy5NZi5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSl9Y2F0Y2goYyl7dGhpcy5NZigpfX1mdW5jdGlvbiBhKCl7dGhpcy5UZCh0aGlzLlliLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlViJiZ0aGlzLlViLmxlbmd0aCl7dmFyIGQ9dGhpcy5VYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLk1mKCl9LEVvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLnFjKXRyeXtlLkVkKHRoaXMucWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuRGI9IXRoaXMuZ2IoYS5jYyk7dGhpcy5PZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5qaSgpfWVsc2UgdGhpcy5PZigpfSxqaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuV2IoKTt0aGlzLnllKCl9LEZtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LApXYjpmdW5jdGlvbigpe3ZhciBhPSIwIixnPSIwIjt0cnl7ZS5DYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnVjJiYoZz0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitnLCEwKTt0aGlzLnFjJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuRGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLmZlKSk7dGhpcy4kZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLiRkJiZ0aGlzLiRkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkRifSl9LGxsOmZ1bmN0aW9uKCl7aWYodGhpcy5ZZCYmdGhpcy5ubSgpKXt2YXIgYT10aGlzLlhsKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZyl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPQphLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxKYTpmdW5jdGlvbihhLGcsZCxmLGMsaCl7dGhpcy5CZHx8KHRoaXMuQmQ9MCk7dGhpcy5CZCsrO3RoaXMuQmQ+dGhpcy5uaCYmIXRoaXMub2gmJih0aGlzLm9oPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5uaCwhMCkpO2E9bmV3IExhKGEsZyxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtmJiYoYS5FaT0hMCk7YyYmZS5EbSgpJiYoYS5ZZz0hMCk7aCYmKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0saWw6ZnVuY3Rpb24oKXt0aGlzLlltfHwodGhpcy5ZbT0hMCxlLkNhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LApmdW5jdGlvbihhKXt2YXIgZz1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihmPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGZbMF0mJihmPWZbMF0pLGYpe2Y9ZiYmZi5jaGlsZE5vZGVzJiZmLmNoaWxkTm9kZXNbMF0/Zi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLk5jKCl8fChmPXRoaXMuYWEoZiksZj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGQpe31lLm5ldHdvcmtTdGF0ZT09CmUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9ZS5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGcpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpO2UubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LAp4bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5YZn0samw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkphKGEsdGhpcy5Wby5iaW5kKHRoaXMpLHRoaXMuVW8uYmluZCh0aGlzKSl9LFZvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8CnRoaXMuSGwoKX0sVW86ZnVuY3Rpb24oKXt9LEhsOmZ1bmN0aW9uKCl7ZS5IYyhrLkdsKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx5ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMud2IubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy53YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5iYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZmEoKV09dGhpcztlLmJiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEpvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuVWR9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLAphfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxZOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBnPSIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxnYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxDYjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sYWE6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbZ1tmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sRWY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsZT1BcnJheSg4MCksaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZik7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1oO249aztxPWw7cj1tO3U9dDtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZxfH5uJnIpK3UrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7Zm9yKGY9MjA7Mzk+PWY7ZisrKXY9ZChjLDUpKyhuXnFecikrdStlW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1xLHE9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTQwOzU5Pj1mO2YrKyl2PWQoYyw1KSsobiZxfG4mcnxxJnIpK3UrZVtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZj02MDs3OT49ZjtmKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihnKGgpK2coaykrZyhsKStnKG0pK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLnVqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5MaXx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5lYj1hLmMuUigpOnRoaXMuZWI9IiI7YS5jLnZoJiZhLmMudmgoe3BhdXNlOnRoaXMuSGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy4kaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5oZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLlBvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEub2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5oYz10aGlzLmxkPSExO3RoaXMuWGs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9Zzt0aGlzLmliPXt9O3RoaXMudmlkZW89e307dGhpcy5RZD17fTtlLnJiKCJuZXdCaWdBZElkIik7dGhpcy4kaz1lLlkoMTApOwp0aGlzLklmPTA7dGhpcy5oZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmhkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmhkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlVrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUmM9dGhpcy5QZD0hMTt0aGlzLkVoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5zZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMubWM9ITE7dGhpcy53bD1lLlkoMTApO3RoaXMuTmI9ZS5ZKDEwKTt0aGlzLkxiPWUuWSgxMCk7dGhpcy5laT1lLlkoMTApO3RoaXMuY29uZj17fTt0aGlzLmFlPQp0aGlzLlhiPXRoaXMuQ2U9dGhpcy5zZD10aGlzLlJkPXRoaXMueGI9dGhpcy5zYz10aGlzLk5oPXRoaXMuQmU9dGhpcy54ZD10aGlzLktvPXRoaXMuQWI9dGhpcy5NYj0hMTt0aGlzLnhjPVtdO3RoaXMubmM9e307dGhpcy5tbj0yMDA7dGhpcy4kZj10aGlzLlljPXRoaXMuQ2M9dGhpcy5aZj10aGlzLnNmPSExO3RoaXMua2Y9e319Yy5vaj1hO2EucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBnfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMucG8oKTtlLm8oay5Mayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxjZjpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLkFiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLklmKyssZS5yYigibmV3U21hbGxBZElkIiksdGhpcy5BLmxsKCksYz1tLmdldENvbmZpZygpLGUuRGUmJih0aGlzLkEuVW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5JYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5yaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkVoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLnJpKCksCm5ldyBTKHRoaXMsYSx0aGlzLkVoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmhiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB2Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2Yy5jZihhLGcsZCl9LDUwKX19LG9mOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5hZT10aGlzLlhiPXRoaXMuQmU9dGhpcy54ZD0hMTt0aGlzLmI9YTt0aGlzLmpvKHRoaXMuYik7dGhpcy5qaChhKTt0aGlzLnhjPXRoaXMuJGcoYSk7dGhpcy5wbCgpfSxqaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5RZD10aGlzLmhtKGIpKSx0aGlzLmpoKGIucGFyZW50KSl9LCRnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy4kZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLlJsKGIpKSk7cmV0dXJuIGd9LFJsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5MJiZhLkwuZ2V0QXR0cmlidXRlKXtnPWEuTC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxobTpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuTCl7Zz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuTC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEucGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scmE6ZnVuY3Rpb24oYSl7YS5aYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS51ZCYmYS51ZC5lcnJvciYmYS51ZC5lcnJvci5jb2RlJiYoZz1hLnVkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuJGMuY29kZTpnPT1GLmplLmNvZGU/ZS5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZS5kZigpLGc9PUYuZGcuY29kZSYmZS5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7ZS5vKGsuRmwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnFvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuRGImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5EYiwhMCk7YnJlYWs7Y2FzZSB2LmJnLmNvZGU6ZS5vKGsuV28sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmUubyhrLnFwLAp0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5rZS5jb2RlOmUubyhrLnJwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuZ2UuY29kZTplLm8oay5lbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuY2UuY29kZTplLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuYWcuY29kZTplLm8oay5Ubyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLldhKCJ1bmtub3duIil9dGhpcy5pYyhhKTt0aGlzLlFhKCl9LGljOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTmEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5OYS5wb3AoKTt0aGlzLmJmKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxqbzpmdW5jdGlvbihhKXt0aGlzLkNlPSExO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5EZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmliLnpJbmRleD1nO2c9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC56ZCYmKGM9ZC56ZCgpKTtjLnZpZGVvU2xvdCYmKGc9Yy52aWRlb1Nsb3QsdGhpcy5zZj0KITApfWNhdGNoKGgpe31nLnNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5VayYmdGhpcy5wbGF5ZXIuSmUoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkplKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk8ubGVuZ3RoO2QrKylnLmNhblBsYXlUeXBlKGEuT1tkXS50eXBlKSYmCnRoaXMuUGsoZyxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLnNmJiZnLmxvYWQoKTtpZih0aGlzLm1pKGcpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlNrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5zZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuc2woKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXToKYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZyksdGhpcy5obygpKTp0aGlzLmIub3JpZ2luLlJnKHYuZ2UpfSxobzpmdW5jdGlvbigpe3RoaXMuWmY9ITA7dGhpcy54Yj10aGlzLnNjPSExO3RoaXMuYS5jLmthJiZ0aGlzLmEuYy5rYSgpJiYoZS5vKGsuSWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLnhiPSEwKTtlLnplKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm9hJiZlLlRrKHRoaXMuYi5vcmlnaW4ub2EpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5CO3RoaXMuYS5CPUQucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQixhKTt0aGlzLmEuT2goKTt0aGlzLmEuRmYoKTtmb3IoYT10aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYS5GZigpO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5EZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLnhiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuUWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLkRmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5rbSgpLGM9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmYi51cmwmJjA8PWIudXJsLmluZGV4T2YoIndlbGVjdC5qcyIpJiZ0aGlzLkEpe3ZhciBoPXRoaXMuQS5nZXRDb25maWcoKTtoJiZoLmFkRmFsbGJhY2tDb25maWcmJmguYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyYmKGM9SlNPTi5zdHJpbmdpZnkoaC5hZEZhbGxiYWNrQ29uZmlnKSl9dmFyIGs9Cntob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuRCwiY29uZmlnIixrKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsCmspfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUueGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIiwKdGhpcy5BKTt0aGlzLkQuc3JjPWE7ZS51ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlJkJiZ0aGlzLmEuYy51YSgpJiZlLm8oay5FYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5rYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy54Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZXAoKSx0aGlzLmEua2MoITApLCF0aGlzLlhiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSwKdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5YYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5hZT0hMDtlLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5XZSh0aGlzLlhiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEua2MoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmtjKCEwKSx0aGlzLm1wKCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtwKCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmxwKCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubnAoKTsiQWRWaWRlb0NvbXBsZXRlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLm5iKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UubyhrLkhnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5CY3x8dGhpcy5ZYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChkKXt3aW5kb3cub3BlbihoLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ocCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT0KYS5kYXRhLm5hbWUmJmUubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlljJiYodGhpcy4kZj0hMSx0aGlzLnBjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy54Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUWIoIm11dGVkIiwidXNlciIpLGUubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLnhiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5RYigidW5tdXRlZCIsCiJ1c2VyIiksZS5vKGsuUWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZS5vKGsucWUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtlLnVlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcykpO2UudWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEudWcoZnVuY3Rpb24oYSl7ZS5sYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMudHJhY2soInBhdXNlIik7ZS5vKGsub2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuc2M9ITB9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7CmEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5zYz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLmdpKCk7ZS5vKGsubGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sbXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWGEoInN0YXJ0Iik7ZS5vKGsuZmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sCmtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMueGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2UubyhrLm5nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtlLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMuVWYoKTt0aGlzLlhhKCJjb21wbGV0ZSIpfSxDaTpmdW5jdGlvbihhKXtpZih0aGlzLkQmJnRoaXMuRC5wYXJlbnROb2RlJiZ0aGlzLkQucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLldhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgZz0KdGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtnLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZyk7ZS56ZSgpO3RoaXMuRD0hMTt0aGlzLlFhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGc9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZyYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZz1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZy5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2UubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LFBrOmZ1bmN0aW9uKGEsZyl7ZnVuY3Rpb24gZChhLGIpe2lmKGIuSWEmJmIuaXNFbmFibGVkJiYhYi5OYygpKXt2YXIgZD1iLmFhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKYy5zcmM9ZChnLHRoaXMuQSk7Yy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChnLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sU2s6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5XZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5VZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlZmLmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5XZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5VZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlZmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGN8fHRoaXMuV2YoYSl9LmJpbmQodGhpcyksdGhpcy5YaykpfSxXZjpmdW5jdGlvbihhKXtpZighdGhpcy5sZCYmdGhpcy5taSh0aGlzLnZpZGVvKSYmIXRoaXMuTWImJiF0aGlzLmhjKXt0aGlzLmxkPSEwO3RyeXtpZighZS5DYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5iLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuTWJ8fCh0aGlzLk1iPSEwLHRoaXMuTGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5QZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUWEoKTtyZXR1cm59fWNhdGNoKGcpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5GZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy55ZygpO3RoaXMuYS5PaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5KZigpfX0sSmY6ZnVuY3Rpb24oKXt0aGlzLnNkfHx0aGlzLmpnKCl9LGpnOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMudmlkZW8ucGxheSgpO2lmKGcmJmdbImNhdGNoIl0pZ1siY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuc2R8fChhP3RoaXMuUWEoKToodGhpcy5oZighMCksdGhpcy5qZyghMCkpKX0uYmluZCh0aGlzKSk7CmNhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5vYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm9jLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm9jLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy5zZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuSmYoKSl9LmJpbmQodGhpcyk7dGhpcy5MZSgpLmRpKHRoaXMpfSxVZjpmdW5jdGlvbigpe3RoaXMuQS5hYiYmIXRoaXMuTWImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTt0aGlzLkJlPSEwO2UubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5RYSgpfSxNazpmdW5jdGlvbihhKXtmb3IodmFyIGc9W10sZD0hMSxjPTA7YzxhLmxlbmd0aDtjKyspZD1lLmVoKGFbY10pLApnLnB1c2goZCk7YT17aGFzaGVzOmd9O2E9ay5TYShhLHRoaXMudSgpKTtlLm5vKGEpfSxRYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5iZSYmdGhpcy5Nayh0aGlzLmIuYmUpO2lmKCF0aGlzLkNlKWlmKHRoaXMuQ2U9ITAsdGhpcy5hZXx8KGUubyhrLmhuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnpifHx0aGlzLmIudmMpe2UucmIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuSWYrKzt0aGlzLmhjPXRoaXMubGQ9ITE7dHJ5e3RoaXMuTGQodGhpcy52aWRlbyl9Y2F0Y2goZyl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5pYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChjKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLlBkPSExO3RyeXt0aGlzLmEudmkoKX1jYXRjaChoKXt9dGhpcy5SZD0hMDt0aGlzLmEuUGUoKTsKdGhpcy5tYz0hMTt0aGlzLkxlKCkuWWgoKTt0aGlzLmIuemImJnRoaXMuYi5vcmlnaW4uamYoKTt0aGlzLmIudmMmJihhP3RoaXMuYi5vcmlnaW4uSGgoKTp0aGlzLnJkKCkpfWVsc2UgdGhpcy5yZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkxkKHRoaXMudmlkZW8pLHRoaXMuVmYoYSkpfSxWZjpmdW5jdGlvbihhKXt0aGlzLmhjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5pbCgpO3RoaXMuYi5vcmlnaW4uUmcodi5nZSl9LEFpOmZ1bmN0aW9uKCl7aWYodGhpcy5Lbyl0aGlzLlFhKCk7ZWxzZXt0aGlzLm1jPQohMDt0aGlzLmEuYy51YSYmIXRoaXMuUmQmJnRoaXMuYS5jLnVhKCkmJmUubyhrLkVjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk5vKGEpO2lmKCF0aGlzLlhiKXt2YXIgZz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuWGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmFlPSEwO2UubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6ZyxwZXJjZW50OmQsCnN0YXJ0VGltZTohMX07ZS5XZSh0aGlzLlhiKX1kPSIiO3RoaXMuYi5IZiYmKGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuSGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuUGR8fCh0aGlzLlBkPSEwLGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLnpiPyh0aGlzLmhjPXRoaXMubGQ9ITEsdGhpcy5MZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLlBkPSExLHRoaXMuYS52aSgpLHRoaXMuYi5vcmlnaW4uamYoKSk6CnRoaXMuUWEoKX0uYmluZCh0aGlzKSkpKSxnLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuaGQucmVwbGFjZSgiW3RpbWVdIixlLlpnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMuc2U9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5OaHx8KHRoaXMuTmg9ITAsdGhpcy54ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE5vOmZ1bmN0aW9uKGEpe2UubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5NYnx8KDA9PWEmJih0aGlzLkFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLkFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5EYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsCmZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5NYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmFiJiZ0aGlzLlhhKCJzdGFydCIpLGUubyhrLmxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZS5vKGsucWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYWImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy54ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmlnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PQpNYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5hYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUubyhrLm5nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYWImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGcpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxnLCEwKX0scG86ZnVuY3Rpb24oKXtlLldkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LApnaTpmdW5jdGlvbigpe2UuV2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scW86ZnVuY3Rpb24oKXtlLldkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7ZS5XZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5aZnx8dGhpcy5BLmFiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFFiOmZ1bmN0aW9uKGEsZyl7dGhpcy5BLmFiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsZywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZyl7aWYoIXRoaXMuTWIpe3RoaXMua2YmJnRoaXMua2YudHJhY2smJnRoaXMua2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLkRlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwKImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5pbSh0aGlzLmIuTmEsYSl9Y2F0Y2goYyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkNjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuUWQuaW1wcmVzc2lvbnMmJmUuQm0oaC51cmwsdGhpcy5RZC5pbXByZXNzaW9ucyk/dGhpcy5iZihoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuUWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5iZihoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZyl0cnl7dGhpcy5iLk5hPXRoaXMuemwodGhpcy5iLk5hLGEpfWNhdGNoKEIpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWUuQ2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYz0iIjt0aGlzLlpmJiYoYz0iX3ZwYWlkIik7dGhpcy5ZYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxiZjpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQS53YShhKSxkJiZjLk9rKGQpLGZ8fChmPXRoaXMuT2cpLGV8fChlPXRoaXMuT2cpLHRoaXMuUWsoYSksdGhpcy5BLkphKGMsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFFrOmZ1bmN0aW9uKGEpe3RoaXMubmNbYV09Im9wZW4ifSxYaDpmdW5jdGlvbihhKXt0aGlzLm5jW2FdPSJjbG9zZWQifSxwbDpmdW5jdGlvbigpe3RoaXMubmM9Cnt9fSxzbzpmdW5jdGlvbigpe3ZhciBhPTAsYztmb3IoYyBpbiB0aGlzLm5jKXRoaXMubmMuaGFzT3duUHJvcGVydHkoYykmJiJvcGVuIj09dGhpcy5uY1tjXSYmYSsrO3JldHVybiBhfSxpbTpmdW5jdGlvbihhLGMpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1jfSl9LHpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS50ZyYmYS50Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZS5DYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5wYygpO2Vsc2UgaWYodGhpcy5iLm5iKXt0cnl7dmFyIGE9KG5ldyBEYXRlKS5nZXRUaW1lKCk7CnRoaXMuYi5BZXx8KHRoaXMuYi5BZT0xKTtpZigxMDA+YS10aGlzLmIuQWUpcmV0dXJuO3RoaXMuYi5BZT1hfWNhdGNoKGMpe31lLm8oay5IZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuQmN8fHRoaXMuWWMpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIubmJ9Y2F0Y2goYyl7YT13aW5kb3cub3Blbih0aGlzLmIubmIsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5uYiwiX3RvcCIpfWNhdGNoKGcpe3dpbmRvdy5vcGVuKHRoaXMuYi5uYiwiX3RvcCIpfX19LmJpbmQodGhpcyksNTAwKX19LFhvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmhkLnJlcGxhY2UoIlt0aW1lXSIsZS5aZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5BLm5kJiYoYz10aGlzLkEubmQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmIuYmluZCh0aGlzKSwKMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sRmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5uZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sTmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5uZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFlLktmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy53bDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYygpO3RoaXMuTmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IiwKZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYygpO3RoaXMuTmQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOgooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkxiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkxvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucGMoKTt0aGlzLk5kKCl9LmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLmVpO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuSGYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuQ2EoKXx8Cih0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnBjKCk7dGhpcy5OZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLApkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS51ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLklnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5oZigpKTt0aGlzLkdiKCl9fSxHYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHBjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLiRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5mZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLm9lLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLnNjPyhlLmxhKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuc2M9ITEpOihlLmxhKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5zYz0hMCl9LEhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsub2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5mZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlFiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLlFmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUWIoIm11dGVkIiwidXNlciIpLGUubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxNbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpOwp0aGlzLnhiPyhlLmxhKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMueGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMueGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0saGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5RYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuRmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFBvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlFiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLlFmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxvYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLm9jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm9jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5vYyk7dGhpcy5zZHx8dGhpcy5zZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuSmYoKSl9LHJkOmZ1bmN0aW9uKCl7dGhpcy5LbSgpJiZ0aGlzLkptKCkmJih0aGlzLkEudWN8fCJzcGllZ2VsLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuSmImJnRoaXMuT28oKXx8KHRoaXMuc2Q9ITAsdGhpcy5BYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5BYj0hMSksdGhpcy5KZygpKX0sS206ZnVuY3Rpb24oKXt2YXIgYT1lLnZkKCk7aWYoIXRoaXMuQS5oYnx8ZS5DYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGM9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuQ2EoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsYytkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LEptOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuUmN8fChhPQohMCxjLmFkRmFsbGJhY2tVUkx8fChjLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkNjJiZjLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5SY3x8ZS50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuQ2M/ImFueSI6IiIpKyhjLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5SYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuQ2MmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlJjfSxZbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sT286ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgYz1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoYy5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmMuYXZhaWxhYmxlKXtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgZz1lLnhnKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoZylyZXR1cm4gdGhpcy5jZihnLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy5yZCgpfXZhciBjPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuWWwoKTt0aGlzLkNjPXRoaXMuUmM9dGhpcy5ZYz10aGlzLiRmPSEwO3JldHVybiBjPyhlLmJiKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2MsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LEpnOmZ1bmN0aW9uKGEpe3RoaXMuc28oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpnKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5tbik6KHRoaXMuUmQ9ITAsdGhpcy5hLlBlKCksdGhpcy5hLlJuKCksdGhpcy5tYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkJlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGUubyhrLnZsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5MZSgpLlloKCkpfSxMZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEoIm1pblZpcyIpO2EmJihlLlZlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuSGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5uYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi56Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy54YyYmMDx0aGlzLnhjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy54YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy4kaysiLSIrdGhpcy5JZjt0aGlzLmImJnRoaXMuYi5maCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZmgoKSk7cmV0dXJuIGF9LE9nOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5vanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5Hb3x8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubmE9bnVsbDt0aGlzLlc9W107dGhpcy5MPW51bGw7dGhpcy53Yz10aGlzLnljPSExO3RoaXMub2E9IiI7dGhpcy5ZZj0hMTt0aGlzLnFoPSIiO2QmJmQuZW1wdHk/dGhpcy5UbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLnNrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnZkKCksYjtiPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOm0ud2EobS5TZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihlLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuSCgiZmFuZG9tLmNvbSIpfHxlLkgoImdpZ2EuZGUiKXx8ZS5IKCJraW5vLmRlIil8fGUuSCgic3BpZWxldGlwcHMuZGUiKXx8ZS5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8ZygpKXt2YXIgaD1lLkxnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGc9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxsPWZ1bmN0aW9uKCl7cmV0dXJuKGUuSCgiZ2lnYS5kZSIpfHxlLkgoImtpbm8uZGUiKXx8ZS5IKCJzcGllbGV0aXBwcy5kZSIpfHxlLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZygpfHxrKCl8fGwoKXx8ImFwcHNwb3QiPT1jKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLlNkKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLlNkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZS50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bS53YShtLlNkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5KYShiLHRoaXMuU20uYmluZCh0aGlzKSx0aGlzLlBtLmJpbmQodGhpcykpfSxhaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5uYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkpiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5KYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuSmJ8fHRoaXMuSG0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0ueG8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSG06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxTbTpmdW5jdGlvbihhKXt0aGlzLnpuKGEpO3RyeXt0aGlzLm5hPWEucmVzcG9uc2VYTUwsdGhpcy5uYXx8KHRoaXMubmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2LmtlKSl9dGhpcy5XPXRoaXMuYWgoKTt0aGlzLnljPXRoaXMuTmYoKTt0aGlzLndjPXRoaXMua2koKTt0aGlzLnFoPWEudXJsQ2FsbGVkO2lmKHRoaXMuVy5sZW5ndGgpdGhpcy5RYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlJhKHYuJGMse2Vycm9yOnRoaXMuWWY/Ri5qZTpGLmNnfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuVWEodGhpcy5vYSksITApfWNhdGNoKGMpe319fSxUbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5uYXx8Cih0aGlzLm5hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2LmtlKSl9dGhpcy5XPXRoaXMuYWgoKTt0aGlzLnljPXRoaXMuTmYoKTt0aGlzLndjPXRoaXMua2koKTt0aGlzLlcubGVuZ3RoP3RoaXMuUWMoKTp0aGlzLnJhKHRoaXMuUmEodi4kYyx7ZXJyb3I6dGhpcy5ZZj9GLmplOkYuY2d9KSl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlJhKHYuYmcse2RlcHRoOmJ9KSl9LFFjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuVy5zaGlmdCgpO3RoaXMuTG0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMua2goKSxnLHtBZFN5c3RlbTp0aGlzLlFsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMub2YodGhpcy55bCgpKSl9LGpmOmZ1bmN0aW9uKCl7dGhpcy55Yz8odGhpcy55Yz0xPHRoaXMuVy5sZW5ndGgsCnRoaXMuVy5sZW5ndGgmJnRoaXMuUWMoKSk6dGhpcy5wYXJlbnQuamYoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLlFjKCkpOnRoaXMucGFyZW50LkhoKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLkljKCk/dGhpcy5yYSh0aGlzLlJhKHYuY2UpKTp0aGlzLnJhKHRoaXMuUmEodi5hZykpLCExKToodGhpcy5yYSh0aGlzLlJhKHYuJGMsRi5kZykpLCExKX0sb2Y6ZnVuY3Rpb24oYSl7dGhpcy5vYXx8KHRoaXMub2E9IiIpO2EuYmV8fChhLmJlPVtdKTthLmJlLnB1c2godGhpcy5xaCk7YS5OYT1hLk5hLmNvbmNhdCh0aGlzLmVmKCkpO2EuemI9YS56Yj9hLnpiOnRoaXMueWM7YS52Yz1hLnZjP2EudmM6dGhpcy53YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5vYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuWGc7dGhpcy5wYXJlbnQub2YoYSl9LAp5bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5kdXJhdGlvbj10aGlzLkljKCk7YS5PPXRoaXMuaGgoKTthLm5iPXRoaXMuVGwoKTthLnpxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUGwoKTthLkhmPXRoaXMuZ20oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlhnO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlhnO2lmKCF0aGlzLkwmJnRoaXMubmEmJnRoaXMubmEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLkw9dGhpcy5uYTt0cnl7aWYodGhpcy5MJiZ0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5OYT1hLmVycm9yLmNvZGUhPXYuY2UuY29kZT9hLk5hLmNvbmNhdCh0aGlzLlVsKCkpOmEuTmEuY29uY2F0KHRoaXMuY20oKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5pYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmljJiZ0aGlzLnBhcmVudC5pYyhhKSxiPTAsdGhpcy5RYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGljOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmljKGEpfSxSZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaGgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5JYygpfSxOZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5OZigpJiYoYT0hMCk7cmV0dXJuIGF9LHpuOmZ1bmN0aW9uKGEpe3RoaXMub2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5vYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm9hPSJVTktOT1dOIn10cnl7dGhpcy5ZZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMbTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmtoKCkubGVuZ3RofSxraDpmdW5jdGlvbigpe3JldHVybiB0aGlzLktlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFFsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2UodGhpcy5MLCJBZFN5c3RlbSIpfSxlZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnhoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnBiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMueGgoYS5wYXJlbnROb2RlKTohMX0sY206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sVWw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUGE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxVcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5wYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5QYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5QYSktTWF0aC5hYnMoZC1iLlBhKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxQbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5BZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sSWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5wYih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGdtOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUubW8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sS2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnBiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxOZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0scGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5BZChhKToiIn0sQWQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5OZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuc2t8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5Wa3x8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5PPVtdO3RoaXMubmI9IiI7dGhpcy5zPXRoaXMudmM9dGhpcy56Yj0hMTt0aGlzLlJlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5TZT0iIn1jLllqPWE7YS5wcm90b3R5cGU9e3NsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTy5sZW5ndGg7YysrKWlmKDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGFtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5uYSl7dmFyIGE9dGhpcy5vcmlnaW4ubmE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5SZT1hW2RdKX1yZXR1cm4gdGhpcy5SZX0sCmZoOmZ1bmN0aW9uKCl7aWYodGhpcy5TZSlyZXR1cm4gdGhpcy5TZTt2YXIgYT0iIjsoYT10aGlzLmFtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5TZT1hfSxrbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk8ubGVuZ3RoO2MrKylpZigwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuWWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuc3B8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtrZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixNYToiWE1MX1BBUlNFX0VSUk9SIn0sYWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixNYToiRFVSQVRJT05fRVJST1IifSwkYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTWE6IkVNUFRZX1ZBU1QifSxlZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixNYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sYmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk1hOiJMT0FEX0VSUk9SIn0sZ2U6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE1hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTWE6Ik1FRElBRklMRV9FUlJPUiJ9LGNlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE1hOiJEVU1NWV9BRCJ9fSxGPXtjZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE1hOiJOT19BRFMifSxkZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTWE6Ik5PX01FRElBRklMRVMifSx2cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixNYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLnhrfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnVkPWM7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLmRqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5Xa3x8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1jO3RoaXMuWmQ9W107dGhpcy5XaD1bXTt0aGlzLmxmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLndwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5aaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5vcT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Gbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlpkLnB1c2goe3NyYzpkLGZyYW1lOmgsbm46ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMubGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5sZltjXTtkLnR5cGU9PT1hJiZkLmNsKHRoaXMuVmwoYSkpfX0sVmw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7eHE6ITAsd3E6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7bHE6InZpZGVvIixBcToianNDdXN0b20iLEJxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQ3E6MSxWcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxqbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuWmQubGVuZ3RoO2MrKylpZih0aGlzLlpkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuWmRbY10ubm47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsYyl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5qbShjKSx2ZW5kb3I6Y30pO3RoaXMub28oKX0sRm46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnZnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMudmcoYSxjKX0sdmc6ZnVuY3Rpb24oYSxjKXt0aGlzLmxmLnB1c2goe3R5cGU6YSwKY2w6Yyx1cTohMX0pfSxvbzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuRW18fChhLm5xKHthZFNlc3Npb25JZDplLlkoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnlxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5FbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLm5rfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLm9iPWEuYmgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlkoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk9hPXt9O3RoaXMud2c9ITE7dGhpcy5kYz1bXX1jLmJqPWE7YS5wcm90b3R5cGU9e09sOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuT2woYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLnJtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSx2bzpmdW5jdGlvbigpe3RoaXMud2c9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5FYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLndnfHwodGhpcy5jLnBsYXkoKSxlLm8oay5xZCx0aGlzLmMubCgpKSl9LEZmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLm9iLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5vYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5vYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLm9iLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMub2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMub2IpO3RoaXMuYy5VYyYmdGhpcy5jLlVjKCk/dGhpcy5jLmJoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0scm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxNbDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGtjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuTWwodGhpcy5vYik7aWYoYy54IT10aGlzLk9hLnh8fGMueSE9dGhpcy5PYS55fHxjLnBvc2l0aW9uIT10aGlzLk9hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk9hLndpZHRofHxjLmhlaWdodCE9dGhpcy5PYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5PYS53aWR0aCYmMDx0aGlzLk9hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuUGUoKTtyZXR1cm59dGhpcy5PYT1jO3RoaXMuYy5VYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmRjLmxlbmd0aDthKyspdGhpcy5kY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLktmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2MuYmluZCh0aGlzKSwxMCl9LHVnOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLmRjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5kYy5wdXNoKGEpfSxQZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5ianx8WWEsRD1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5ZKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMua2p8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuTWQoYSk7dGhpcy5NZygpfSxNZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sTWc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlRhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5UYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLlNqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLiRiPXRoaXMuJGJ8fCExO3RoaXMubWc9dGhpcy5vZz10aGlzLnVoPXRoaXMudmE9dGhpcy5QZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLktsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnVoJiZ0aGlzLkVnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuSWI7YSYmYS5tYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5vZCgpO3RoaXMudWg9ITA7dGhpcy5FZygpfS5iaW5kKHRoaXMpKTt0aGlzLkFnKCl9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3RoaXMub2QoKTtpZighdGhpcy5QZiYmIXRoaXMub2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlBmJiZ0aGlzLm1nJiYhdGhpcy5vZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKX19LG9kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5paCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxpaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sQWc6ZnVuY3Rpb24oKXtpZih0aGlzLm9kKCkpe3ZhciBhPXRoaXMuaWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5vZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLm1nPWEuU3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMDApfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5qcSgpOiExfSxJYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuSWMoKTotMX0sZG06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LEtsOmZ1bmN0aW9uKGEsYil7dGhpcy4kYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLiRifHwzMDI9PXRoaXMuJGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuJGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmlhKCkpOmEuVGUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5kbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Sanx8YmI7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxHbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5iay5Iay5Gaz93aW5kb3cuT08uYmsuSGsuRmsuUXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5NZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLlRqfHxjYixkYj1uZXcgY2IodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5sbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMubG58fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuZ2E9ITE7dGhpcy5saCgpfSxsaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5VKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LExhOmZ1bmN0aW9uKCl7dGhpcy5SaCgpfSxSaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuViYmKDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLlNpfHxmYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5pYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmlhKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkJnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuQmcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLlJpfHxnYjsoZnVuY3Rpb24oYyl7Yy5UaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5NZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5MbHx8KHRoaXMuTGw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYixUPW5ldyBoYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLkRsfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxVYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cuZ2QoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3LmdkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuam4oYSl9LmJpbmQodGhpcykpO3cuZ2QoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5nZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubW0oKX0sam46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5HZCYmKGE9ZS5BbChhLHRoaXMuR2QpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5NKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkYpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkdkfHwodGhpcy5HZD1bXSksdGhpcy5HZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5NKGQpfHwodGhpcy5OKGQpLGY9bmV3IFYoZCx0aGlzLkYpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZ2Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwKKHRoaXMuYmFbYV09e30pO3RoaXMuYmFbYV1bYl18fCh0aGlzLmJhW2FdW2JdPVtdKTt0aGlzLmJhW2FdW2JdLnB1c2goYyl9LEhvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYmF8fHRoaXMuYmEmJiF0aGlzLmJhW2JdKXRoaXMuUGN8fCh0aGlzLlBjPVtdKSx0aGlzLlBjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy52ZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxtbTpmdW5jdGlvbigpe2lmKHRoaXMuUGMpZm9yKHZhciBhPTA7YTx0aGlzLlBjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuUGNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5iYVtjXVtkXSYmMDx0aGlzLmJhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYmFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmJhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5IbyhhKX19KX0pKGMpO3ZhciBqYj1jLm1rfHxqYix3PW5ldyBqYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMudGt8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9pPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuT2l8fGxiOyhmdW5jdGlvbihjKXtjLlBpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLlBpfHxtYjsoZnVuY3Rpb24oYyl7Yy5RaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTShoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRikpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkthKWlmKGI9PXRoaXMuS2FbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuS2FbYS5qYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYixvYj1uZXcgbmIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5janx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5HZz10aGlzLkdjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnFsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFsPSEwKTt2YXIgYj10aGlzLlRnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5HYz1iKTtpZighdGhpcy5HZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5HZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuemQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlUoYik7dGhpcy5Fbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTt0aGlzLmZjLnB1c2goYSl9LHJsOmZ1bmN0aW9uKCl7aWYodGhpcy5mYyYmdGhpcy5mYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdHJ5e3RoaXMuZmNbYV0oKX1jYXRjaChiKXt9fSx6ZDpmdW5jdGlvbigpe2lmKHRoaXMuR2MpcmV0dXJuIHRoaXMuR2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuVGcoYSkpcmV0dXJuIHRoaXMuR2M9YX19LFRnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRW46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLm11dGUmJnRoaXMuZWEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sdmg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy5Qanx8cWI7KGZ1bmN0aW9uKGMpe2MuT2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm1hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS56ZCgpPwp0aGlzLkMoKToodGhpcy5FZXx8KHRoaXMuRWU9MSksdGhpcy5FZSsrLDEwMDx0aGlzLkVlP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuUWo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLk0oYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgc2I9Yy5Ranx8c2IsVz1uZXcgc2IodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVsPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHRiPWMuRWx8fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LExhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuemt8fHViOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEtjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxDbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuaWEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy56Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkNuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuS2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy56Yyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmZiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmZiW2JdJiYzMDMhPXRoaXMuZmJbYl0mJjQwMyE9dGhpcy5mYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuaWEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMueWt8fHZiOyhmdW5jdGlvbihjKXtjLkFrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5NKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuQWt8fHdiLHhiPW5ldyB3Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmFsfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5VKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMucGY9ITF9LExhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnRuKCl9LmJpbmQodGhpcyksNTAwKX0sdG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5WJiZ0aGlzLlYoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMucGYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMucGYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxybzpmdW5jdGlvbigpe3RoaXMucGY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLmdrfHx6YjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMucmM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5yY3x8KHRoaXMucmM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5yY3x8dGhpcy5yYysrLHRoaXMucmM8PXRoaXMuWG0/KHRoaXMucmMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnJvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQWI9Yy5ma3x8QWI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBCYj1jLmhrfHxCYixDYj1uZXcgQmIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRGI9Yy53anx8RGI7bmV3IERiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5WKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuZWt8fEViOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubWEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMudGwoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5FYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuTm0oKTp0aGlzLkRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sdGw6ZnVuY3Rpb24oKXt0aGlzLmtnKCl8fHRoaXMuaSghMCl9LE5tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYigpOyFhLnBhJiZhLlcmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxEZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5pYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LEViOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGgpZm9yKHZhciBhPWMuYWQuRWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTGg9YVtlXSk7cmV0dXJuIHRoaXMuTGh9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5FYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLmRrfHxGYjsoZnVuY3Rpb24oYyl7Yy5hZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGtsOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBGYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmFkLkViKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5rbChhW2JdKTt0aGlzLlAoKX19KTtjLmFkLkViPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobCYmbC5wbGF5ZXJhcGkmJihhPWwucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5hZHx8R2IsSGI9bmV3IEdiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5aaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuWml8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVShiKTp0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxpcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApVYzpmdW5jdGlvbigpe3JldHVybiEwfSxUYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5xZj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnFmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMucWYmJmMhPXRoaXMucWZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGUuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEucHEpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuZ2E/dGhpcy52ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxKYj1jLk1qfHxKYixLYj1uZXcgSmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Jaj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBMYj1jLklqfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlUoYikpOnRoaXMuWCgpKTp0aGlzLlgoKTp0aGlzLlgoKTp0aGlzLlgoKX0sYmk6ZnVuY3Rpb24oKXt9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGduOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE1iPWMubWp8fE1iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMueGUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5tYSgpfS5iaW5kKHRoaXMpKX0seGU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy54ZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgTmI9Yy5sanx8TmI7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuZ2F8fHRoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLm5qfHwKT2IsUGI9bmV3IE9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Jbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFiPWMuSW98fFFiO25ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVShiKSk6dGhpcy5YKCkpOnRoaXMuWCgpfSxiaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxnbjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBSYj1jLlZpfHxSYjsoZnVuY3Rpb24oYyl7Yy5XaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLnhlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmlhKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFNiPWMuV2l8fFNiOyhmdW5jdGlvbihjKXtjLlhpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgYz1uZXcgUmIoYVtiXSk7Yy5nYXx8dGhpcy5NKGMpfHwodGhpcy5OKGMpLHdpbmRvdy5icmlkcGxheWVyPWMsKG5ldyBTYihjLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiLFViPW5ldyBUYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLk5pfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPQpiLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5VKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWCgpfSxYZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sRG46ZnVuY3Rpb24oKXt0aGlzLlpjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWmN8fCh0aGlzLlpjPSEwLHRoaXMuWGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlpjJiYodGhpcy5YZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlpjPSExKSx0aGlzLlhkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHVhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgV2I9Yy5Ea3x8V2I7KGZ1bmN0aW9uKGMpe2MuQ2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sVmg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5lYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmVjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuZWMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLlZoLmJpbmQodGhpcyksMTApfSxlYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSWs9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuaSgpKToodGhpcy5Ja3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuaSgpKX0saGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuZWMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhnLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmgoKTt0aGlzLmhnKCk7dGhpcy5HbigpfSxHbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmVjKGEpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLkFuP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLkFuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuZWMoYSkpfX0pfSkoYyk7dmFyIFhiPWMuQ2t8fFhiOyhmdW5jdGlvbihjKXtjLkVrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFdiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5nYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGEuRG4oKSxhPW5ldyBYYihhLHRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgWWI9Yy5Fa3x8WWIsWmI9bmV3IFliKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMua249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciAkYj1jLmtufHwkYjtuZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5waz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLlBoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLmJuPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5YKCl9ZWxzZSB0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxiaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ibn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuVmQoYSl9LmJpbmQodGhpcykpfSxWZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5QaCYmKHRoaXMuUGg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgTj1jLnBrfHxOOyhmdW5jdGlvbihjKXtjLm9rPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5JZSlpZih0aGlzLktifHwKKHRoaXMuS2I9MCksdGhpcy5LYisrLDE1PHRoaXMuS2Ipe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuZW8oKTp0aGlzLmkoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuaSgpOnRoaXMuaSghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkllPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy50YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLkspLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHRiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLks9YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz0KcS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVmE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5nYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKSk7dGhpcy52ZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGFjPWMucWt8fGFjLGJjPW5ldyBhYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBjYz1jLk1pfHxjYztuZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Haj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLkdqfHxaOyhmdW5jdGlvbihjKXtjLkZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnJoPTA7dGhpcy5LPXRoaXMuS3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuTWM9dGhpcy5CYT10aGlzLmpkPSExO3RoaXMuVGg9ZS5PYigxMCk7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5wYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnZiKCksITA7dGhpcy5yaCsrO2lmKDEwPHRoaXMucmgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuaSghMCk6dGhpcy5pKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy56aC5iaW5kKHRoaXMpLDEwMCksITF9LHZiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmIoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnZhPQohMH0sY2E6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCk/KHRoaXMudygpLHRoaXMuaWEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Ganx8YWE7KGZ1bmN0aW9uKGMpe2MuSGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLAp0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5Ianx8ZGMsZWM9bmV3IGRjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMucmt8fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLApiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlUoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5YKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGdjPWMuaWp8fGdjOyhmdW5jdGlvbihjKXtjLmhqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLkNnKCl9LENnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgaGM9Yy5oanx8CmhjOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBnYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5nYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLk0oYSkpe3RoaXMuTihhKTsobmV3IGhjKGEsdGhpcy5GKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgaWM9Yy5qanx8aWMsamM9bmV3IGljKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMudW18fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5HaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5VKGEpOnRoaXMuWCgpKTp0aGlzLlgoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGxjPWMuR2l8fGxjOyhmdW5jdGlvbihjKXtjLkZpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLndlKCk7dGhpcy56ZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSx0YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxEYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LHpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChhPWEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmEuYWRzTG9hZGVyKWZvcih2YXIgYj0wO2I8YS5hZHNMb2FkZXIubGVuZ3RoO2IrKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMuaWEoKSk6dGhpcy5pKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy56Zy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLndlLmJpbmQodGhpcyksMTAwKX0sd2U6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuaSgpOnRoaXMuaSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy53ZS5iaW5kKHRoaXMpLDEwMCl9fSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWEuYmluZCh0aGlzKSwxRTQpO3RoaXMuQyhhKX19KX0pKGMpO3ZhciBtYz1jLkZpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFNhOmZ1bmN0aW9uKGEpe2E9Cm5ldyBsYyhhKTthLmdhP3RoaXMuUCgpOnRoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IG1jKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlNhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5TYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBuYz1jLkhpfHxuYyxvYz1uZXcgbmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGM9Yy5DbHx8cGM7bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkFoPXRoaXMuQ2g9dGhpcy5CaD0hMTt0aGlzLklkPVtdO3RoaXMudWY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHc/bnVsbDp3LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBaYj9udWxsOlpiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLEJyaWRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWI/bnVsbDpVYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEphP251bGw6SmEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9jP251bGw6b2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLiRqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuZW0oYSk6W10sYzt0aGlzLkNoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkJoPQohMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sdGhpcy5haShjKX1lbHNlIGZvcihkIGluIHRoaXMudWYpe2lmKHRoaXMuQWgpYnJlYWs7Yz10aGlzLnVmW2RdO3RoaXMuVGYoYykmJih0aGlzLklkLnB1c2goYyksdGhpcy5haShjKSl9fSxUZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHE/ITA6ITF9LGVtOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYztmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkPWFbZV0sZD10aGlzLnVmW2RdLHRoaXMuVGYoZCkmJmMucHVzaChkKTtyZXR1cm4gY30sYWk6ZnVuY3Rpb24oYSl7dGhpcy5UZihhKSYmYS5mKCl9LHRvOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiByJiYhdGhpcy5CaClmb3IodGhpcy5BaD0hMCxhPTA7YTx0aGlzLklkLmxlbmd0aDthKyspdGhpcy5JZFthXS5WYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLklkW2FdLlZiKX19fSkoYyk7dmFyIHFjPQpjLiRqfHxxYyxMPW5ldyBxYztMLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYz1jLlZtfHxyYztuZXcgcmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGE9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1hLmluZGV4T2YoImhvbWFkIil8fC0xIT1hLmluZGV4T2YoImhkLW1haW4iKSlhPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWEuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1hLnN1YnN0cmluZyhhLmluZGV4T2YoIjoiKSsxLGEuaW5kZXhPZigiaXMgbm90IiktCjEpLGUuSGMoay5SbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuSGMoay5mbiksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciB3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHVjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLGw9ITE7SC5mYSgpO0gud2goKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmZhKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC53aCgpLApmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtILmZhKCk7dmFyIHhjPXdjKGZ1bmN0aW9uKCl7ZS5XZyh3aW5kb3csSC53bSgpLHtpZDp4Y30pfSw1MDApLGlhPWUuWSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBzYz1jLkVqfHxzYztuZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUWg9dGhpcy5jb25mPXRoaXMuSGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkRkPTA7dGhpcy5lYj0iIjt0aGlzLkpkPVtdO3RoaXMuS2Q9MDt0aGlzLlNoPSExO3RoaXMucmY9W107ZS5yYigibmV3QWRkZWxpdmVyeSIpfWMuSWk9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5RaD1hfSxCZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYTt0aGlzLmViPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxXbjpmdW5jdGlvbihhKXt0aGlzLkhiPWF9LFZuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGN9LFZjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLnhtKCkpdGhpcy5IYi5nKHRoaXMuSGIuTGMsdGhpcy5IYi5xYSx0aGlzLkhiLnRmLGZ1bmN0aW9uKCl7dGhpcy5WYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuSGIuZ2MpO2Vsc2UgaWYodGhpcy5vbSgpKXRoaXMuU24oZnVuY3Rpb24oKXt0aGlzLlZjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5FYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPQpuZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLnZvKCk7bC5leGl0RnVsbHNjcmVlbigpO2UucmIoIm5ld0hvbWFkRGlzcGxheSIpO1E9bD1uZXcgUGEobCx0aGlzLkhiLGgpO2wuVG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLldtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWYmJihkPXRoaXMucGxheWVyLmFmKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLmNmKGEsZCxmKTt0aGlzLnBsYXllci5kaShsKX19LHhtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuRGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktCnRoaXMuRGQuZ2V0VGltZSgpLHRoaXMuRGQ9YSwzRTU8Yz8hMDohMTt0aGlzLkRkPWE7cmV0dXJuITF9LGxvOmZ1bmN0aW9uKCl7ZS5yYigicHJlcm9sbCIpO2UuQWYoInByZXJvbGwiKTt2YXIgYT10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkhhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5TZyhhKSk/dGhpcy5WYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLnFkLHRoaXMucGxheWVyLmwoKSkpfSxrbzpmdW5jdGlvbihhKXtpZighdGhpcy5RaCl7ZS5BZigicG9zdHJvbGwiKTtlLnJiKCJwb3N0cm9sbCIpO3RoaXMuJG4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkhhKCJwb3N0cm9sbEFkVGFnIikpOwooZD10aGlzLlNnKGQpKT90aGlzLlZjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnFkLHRoaXMucGxheWVyLmwoKSkpfX0sU2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LEpuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuaW8odGhpcy5rby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5MYSgpfSxPZDpmdW5jdGlvbihhKXtlLnJiKCJtaWRyb2xsIik7ZS5BZigibWlkcm9sbCIpO2lmKCF0aGlzLkZoKXt0aGlzLkZoPSEwO3ZhciBjPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSGEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlZjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLm8oay5xZCx0aGlzLnBsYXllci5sKCkpKX19LEluOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuWm4odGhpcy5PZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5mZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5sbygpO3RoaXMucGxheWVyLmZmJiZ0aGlzLkluKCk7dGhpcy5KbigpfSxLbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkpkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy50cChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLktkPXRoaXMuSmQubGVuZ3RofSxvbTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5LZCYmKGE9ITApO3JldHVybiBhfSxTbjpmdW5jdGlvbihhKXt0aGlzLlNoPWE7Zm9yKGE9MDthPHRoaXMuSmQubGVuZ3RoO2ErKyl0aGlzLkpkW2FdWyJmdW5jdGlvbiJdKHRoaXMueG4uYmluZCh0aGlzKSl9LHhuOmZ1bmN0aW9uKGEpe3RoaXMuS2QtLTthJiZ0aGlzLnJmLnB1c2goYSk7MD49dGhpcy5LZCYmdGhpcy5TaCgpfSxXbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5yZi5sZW5ndGg7ZCsrKWM9dGhpcy5yZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5JaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLllpfHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGt1aVNoaXNoV3VzaG9kb28sa3VpU2hpc2hXdXNob2Rvbyk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
46.4.77.66
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.66.77.4.46.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- c894038ee188c223e93dd1d92a606be67b9590fb3e4a6a0dc484bf3ae961c6ed
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame DBF6
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
Frame B75E
|
74 KB
27 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 18f31e7cf5554306ac5bf2bd314fb4aeb32cbf5379c8f6a0e156e5990b1b00ff
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
publishertag.prebid.js
Show response
static.criteo.net/js/ld/
|
49 KB
16 KB
|
51ms
24ms
|
Script
text/javascript |
2a02:2638:1::3
ASN-CRITEO-EUROPE
|
|
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.giga.de/
Frame 7103
|
24 B
409 B
|
110ms
23ms
|
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,dmFyIGt1aVNoaXNoV3VzaG9kb289a3VpU2hpc2hXdXNob2Rvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cubWZ8fCh3Lm1mPTApO3cubWYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5tZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZighbCl1YyhlYSw1MCk7ZWxzZSBpZighZS5wbil7bC5wYXVzZUJ1dHRvbnx8KGwucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLm11dGVCdXR0b258fChsLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbC5za2lwYWJsZUJ1dHRvbnx8KGwuc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTtsLnNraXBCdXR0b258fChsLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobC5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtsLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxtKX0pfW0uZyhsLmdsb2JhbENvbmZpZyxsLmNsaWVudENvbmZpZyxsLnByZWNoZWNrZWQsbC5vblJlYWR5LGwub25GYWlsdXJlLGwpO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPWwuc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHQoYyxhKXtpZihlLmJsKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkVjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP20uSWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZmE7Yi5CZihjKTtiLlduKG0pO2IuVm4obCk7Yi5LbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKG0ud2IubGVuZ3RoKXt2YXIgYj1tLndiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGc7Zz1lLmNvKHsiW0xPQURTQ1JJUFRdIjplLlkoMTApLCJbVVRJTFNdIjplLlkoMTApLCJbQ0FMTEJBQ0tdIjplLlkoMTApfSk7d2luZG93W2dbIltMT0FEU0NSSVBUXSJdXT1lLkRoLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBnIGluIGIpbFtnXT1iW2ddO3QoYyxhKX07Zz1iLnNjcmlwdHMuc2hpZnQoKTspZS5EaChnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxtKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmNrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5ibD0hMTt0aGlzLkpiPSJzZXR1cCI7dGhpcy5XYz1bXTt0aGlzLnplKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMud24uYmluZCh0aGlzKSk7dGhpcy5xYj17fTt0aGlzLnBoPXt9O3RoaXMueWY9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt1bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5xYlthXSsiXyIpO3JldHVybiBifSxqYzpmdW5jdGlvbigpe3RoaXMueWZ8fCh0aGlzLnlmPWUuWSgxMCkpO3JldHVybiB0aGlzLnlmfSxyYjpmdW5jdGlvbihiKXt0aGlzLnFiW2JdfHwodGhpcy5xYltiXT0wKTt0aGlzLnFiW2JdKz0xOzU8dGhpcy5xYltiXSYmIXRoaXMucGhbYl0mJih0aGlzLnBoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudW8oKSwhMCkpfSx6ZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFRrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGxhOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSx3bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy52bihiLmRhdGEpfSx2bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx1ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LExnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmVoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5FZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGVoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFJrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUuTmwoYikpcmV0dXJuOyhhPXRoaXMuTGcoYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE5sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxWZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sSW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sTWU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZGg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LGZvOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sRGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy54bChhKSxmPTA7ZjxkLmxlbmd0aDtmKyspdGhpcy5mbyhiLGRbZl0ua2V5LGRbZl0udmFsdWUpfSxkbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0seGw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9mPWNbMV0udHJpbSgpOmY9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLmRsKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpmfTthLnB1c2goZCl9cmV0dXJuIGF9LEtmOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHloOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFZlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxmPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2Y9aC5oZWlnaHQ7MD5oLnRvcCYmKGYrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZik7Yz49YSYmKGU9ITApO3JldHVybiBlfSxXZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlZlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldlKGIpfS5iaW5kKHRoaXMpLDEwMCl9LE9iOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxPZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZjtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylmPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2YsYXw9MDtyZXR1cm4gYX0sRWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWI+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBmLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx4PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1iLmNoYXJDb2RlQXQoZik8PDI0fGIuY2hhckNvZGVBdChmKzEpPDwxNnxiLmNoYXJDb2RlQXQoZisyKTw8OHxiLmNoYXJDb2RlQXQoZiszKSxyLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZik7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cltiKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWg7bD14O3k9azt0PW07Zm9yKGY9MDsxOT49ZjtmKyspcT1kKHAsNSkrKG4mbHx+biZ5KSt0K2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7Zm9yKGY9MjA7Mzk+PWY7ZisrKXE9ZChwLDUpKyhuXmxeeSkrdCtjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1sLGw9ZChuLDMwKSxuPXAscD1xO2ZvcihmPTQwOzU5Pj1mO2YrKylxPWQocCw1KSsobiZsfG4meXxsJnkpK3QrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bCxsPWQobiwzMCksbj1wLHA9cTtmb3IoZj02MDs3OT49ZjtmKyspcT1kKHAsNSkrKG5ebF55KSt0K2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3g9eCtsJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeCkrYShrKSthKG0pKS50b0xvd2VyQ2FzZSgpfSxDYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxmLHAsYyxlLGgseD0wO3g8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHgrKyksZj1iLmNoYXJDb2RlQXQoeCsrKSxwPWIuY2hhckNvZGVBdCh4KyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZik/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx2ZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGg9ITEseD0hMSxrPSExLGw9ITE7dHJ5e2E9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuZGM/ITA6ITF9Y2F0Y2godCl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSx4PSFoJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0oa3x8cCkmJiEhd2luZG93LkNTU31jYXRjaChxKXt9Yi5pc1BoYW50b21KUz1hO2IuaXNDaHJvbWVIZWFkbGVzcz1kO2IuaXNGaXJlZm94SGVhZGxlc3M9ZjtiLmlzT3BlcmE9cDtiLmlzRmlyZWZveD1jO2IuaXNTYWZhcmk9ZTtiLmlzSUU9aDtiLmlzRWRnZT14O2IuaXNDaHJvbWU9aztiLmlzQmxpbms9bDtyZXR1cm4gYn0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj17S2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCnNtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LFVqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxKajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LGprOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sWWs6ZnVuY3Rpb24oKXtyZXR1cm4gYi5LaSgpfHxiLlVpKCl8fGIuc20oKXx8Yi5VaigpfHxiLkJrKCl8fGIuSmooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuWWsoKX0sU2w6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGY9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZlsxXSkpcmV0dXJuIGQ9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhhKXx8W10sIklFICIrKGRbMV18fCIiKTtpZigiQ2hyb21lIj09PWZbMV0mJihkPWEubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1kKSlyZXR1cm4gZC5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtpZighYilyZXR1cm4gZlsxXTtmPWZbMl0/W2ZbMV0sZlsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShkPWEubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZi5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBmLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFthW2ZdXT1iW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxnKXthJiYoZC5xdWVyeUtleVthXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZj0wLHA9Yi5sZW5ndGg7ZjxwOysrZilhLmhhc093blByb3BlcnR5KGJbZl0pfHwoZC5wdXNoKGJbZl0pLGFbYltmXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sZm06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxmLnB1c2goYltwXSk7cmV0dXJuIGZ9LG1vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZj0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhmPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmYpOihkPWIuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LFpnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEFmOmZ1bmN0aW9uKGIpe3RoaXMuSmI9Yn0sV2c6ZnVuY3Rpb24oYixhLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5KYjt0aGlzLnJlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsCmQpKSxiLmRpc3BhdGNoRXZlbnQoZil9Y2F0Y2gocCl7dGhpcy5wbj0hMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEhjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5XZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHo9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih6PWsuU2EoYixhKSk7ZiYmKHo9ay5TYSh6LGYpKTtwJiYoej1rLlNhKHoscCkpO2MmJih6PWsuU2EoeixjKSk7aCYmKHo9ay5TYSh6LGMpKTtlLkhjKHopfSx5bjpmdW5jdGlvbihiKXt2YXIgYT17fTsKaWYoIWIuY29kZSlyZXR1cm4hMTtpZihiLnNwZWNpYWxfdHJhY2t8fGIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmZtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPQpiLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LG5vOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5qYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMucmUoYil9LHJlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMueW4oYik7aWYoYSlpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uU2MoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjsKYi5kYXRhLmhvbWFkX2F0PWE7bS5KYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGY9bS5TYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5KYShmLGZ1bmN0aW9uKGQpe3ZhciBmPQohMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxXZDpmdW5jdGlvbihiKXtpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGEsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uU2MoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLkphKGIpfX0sZGY6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uamwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGYoKX0uYmluZCh0aGlzKSwKNTAwKX0sS2U6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnBiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxOZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0scGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5BZChiKToiIn0sQWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5OZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHhnOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5YZShiKXx8dGhpcy5JbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LndmJiZ3aW5kb3cuc2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5WZyhiKSlyZXR1cm4gdGhpcy5WZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQ2IoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPQohMTtkPSExO2Q9dGhpcy5iYihiLGEuQWEsYyxmdW5jdGlvbihiKXtlPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWEuQ2QoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUmsoZSxiKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYixhLGQsZixjLGUsaCx6KXt2YXIgaz1lfHxtO2U9ITA7eiYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWUuZGF0YVt0XT1kW3RdO3JldHVybiBrLkphKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmIoYixhLGQsZixjLGssaCx6KX0uYmluZCh0aGlzKSw1MDApfSxFZDpmdW5jdGlvbihiLGEsZCxmLGMsZSxoKXt2YXIgaz0hMDtoJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIHggaW4gaClkKz0iJiIreCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbeF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUm06ZnVuY3Rpb24oYixhLGQpe3RoaXMuRWQoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuV2MpZm9yKHZhciBjIGluIHRoaXMuV2MpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5XY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuQ2IoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxEaDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkNiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5iYihiLGYuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlJtKGYuQ2QoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LGNvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLldjPWJ9LHRwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5iYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxaazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LEJtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylpZihhW2ZdPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnBqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZW49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuRmw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnFnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmlnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5uZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5yZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSms9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLmxnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuV289e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmRuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkdsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5xcD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnZsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEucWQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5FYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EucGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkxrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5mZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Eub2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EucWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLktrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5obj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkZkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlFmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5JZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuUm89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5mbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLklsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e09lOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZixjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBNYXRoLmFicyhhKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk9hfHwieCIpfSxibTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuT2F8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHlkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy55ZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLnlkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5PZSh0aGlzLmphKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMueWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHdtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHdoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLk9lKHRoaXMuYm0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy55ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnZqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChnW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5nP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy50bXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5LYT17fTt0aGlzLkY9bnVsbDt0aGlzLlRjPTEwMDt0aGlzLlBiPTA7dGhpcy5WYT0xNTA7dGhpcy5WYj0wO3RoaXMuWG4oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlBiPD10aGlzLlZhPyh0aGlzLlBiKyssdGhpcy5WYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlRjKSk6MD50aGlzLlZhJiYodGhpcy5WYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlRjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGI+dGhpcy5WYT8hMDohMX0sdmY6ZnVuY3Rpb24oKXt0aGlzLlBiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuS2FbYS5qYSgpXT0KYTtMJiZMLkNoJiZMLnRvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBlLk1lKHRoaXMuS2EpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLkthKWlmKGI9PXRoaXMuS2FbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuS2FbYS5qYSgpXT8hMDohMX0sQ206ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuS2EpaWYoYS5pZD09dGhpcy5LYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx0cTpmdW5jdGlvbihhKXt0aGlzLkthW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLlpqfHxxOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuVGM9MTA7dGhpcy5QYj0wO3RoaXMuVmE9NTA7dGhpcy5WPW51bGw7dGhpcy5nYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuSWI9IiI7dGhpcy5OZz0hMTt0aGlzLkooKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGc9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZylhLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxMYTpmdW5jdGlvbigpe30saW86ZnVuY3Rpb24oYSl7dGhpcy5WPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVn0sWm46ZnVuY3Rpb24oYSl7dGhpcy5nZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdmfSxmZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuUGI8PXRoaXMuVmEmJih0aGlzLlBiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5UYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sTWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx2cTpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk5rKCk7dGhpcy5NZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxOazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5ZKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFRlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYX0sWDpmdW5jdGlvbigpe3RoaXMuZ2E9ITB9LFVjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxhZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLkliPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5JYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuSWImJihhPSEwKTtyZXR1cm4gYX0scXE6ZnVuY3Rpb24oKXt0aGlzLk5nfHwodGhpcy5OZz0hMCl9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5KaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmZnPSIxIjt0aGlzLmdnPSIyIjt0aGlzLkdrPSIzIjt0aGlzLmJkPTA7dGhpcy5abT0zMDt0aGlzLlpiPVtdO3RoaXMua2I9W107dGhpcy50Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5zZz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuYmQ7dGhpcy5pZD1lLlkoMTApO3RoaXMuQmYoYSk7dGhpcy5ZbihiKX0sZjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxlLmRmKCkpfSxKaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEubWMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmphKCldfHwod2luZG93W2IuZmEoKV1bYS5qYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmphKCldLmluaXRpYXRvcj1lLmpjKCkpO3dpbmRvd1tiLmZhKCldW2EuamEoKV1bZS5qYygpXT93aW5kb3dbYi5mYSgpXVthLmphKCldW2UuamMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmphKCldW2UuamMoKV09MX0sem06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSTt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5qYSgpXSYmd2luZG93W2cuZmEoKV1bYS5qYSgpXS5pbml0aWF0b3IhPWUuamMoKSYmKHRoaXMuQ2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnZtKCk7CmlmKCF0aGlzLnptKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkNmKCk7cmV0dXJufXRoaXMuQ2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxnKTt0aGlzLnBpKCk7dGhpcy5zZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5aYi5wdXNoKGEpLHRoaXMua2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5aYiYmMDx0aGlzLlpiLmxlbmd0aCYmKHRoaXMuWmI9ZS51bmlxdWUodGhpcy5aYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWmIuam9pbigiLCIpKSk7aWYodGhpcy5rYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmtiLmxlbmd0aDtnKyspdGhpcy50Y1t0aGlzLmtiW2ddLnJlYXNvbl09PXRoaXMudGNbYV0mJmIucHVzaCh0aGlzLmtiW2ddLmRldGFpbCksdGhpcy50Y1t0aGlzLmtiW2ddLnJlYXNvbl08CnRoaXMudGNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmtiW2ddLmRldGFpbCksYT10aGlzLmtiW2ddLnJlYXNvbik7dGhpcy50Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihnPWUudW5pcXVlKGIpLGE9YSsiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmZnfSxDZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuZ2d9LGVvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ha30sbWE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkfSxrZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5mZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuZ2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmJkfSxCZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxZbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuSml8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5ybnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuZWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVShhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZWp8fG9hOyhmdW5jdGlvbihjKXtjLmZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmZqfHxwYTsoZnVuY3Rpb24oYyl7Yy5naj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuZ2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkJsfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm1oPXRoaXMuc2I9ITE7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubWg9ITApO3RoaXMuTWg9ITE7dGhpcy5VZygpO3RoaXMuSGUoKTt0aGlzLnVsPSExfSxVZzpmdW5jdGlvbigpe3RoaXMuc2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnNiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk1oPWE7aWYodGhpcy5taCl7dGhpcy5IZSgpO2lmKHRoaXMuc2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxIZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNiKXt2YXIgYT10aGlzLk1oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMuc2I9ITApO3RoaXMuVShiKX19LExhOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuT2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLk9kKGIpfS5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmdmJiYoMCx0aGlzLmdmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LEplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Canx8c2E7KGZ1bmN0aW9uKGMpe2MuQWo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG1hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5iZDt0aGlzLmlzUGxheWluZz10aGlzLm5lPSExO3RoaXMucGU9MTt0aGlzLmNkPVtdO3RoaXMuQmI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLm5lPSExO3RoaXMucGU9MTt0aGlzLmNkPVtdO3RoaXMuQmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5wZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkJiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGc9MDtnPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2crKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ddLnRhZyl7dGhpcy5CYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkJiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkJiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuQmI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPApkLmxlbmd0aDtnKyspYS5vbihkW2ddLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZ10mJih0aGlzLm5lPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZ10mJnRoaXMuSmgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5abSYmIXRoaXMuemEoKSYmKHRoaXMuQmI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubWEoKSx0aGlzLmdldFBsYXllcigpLnVsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuSWI7YiYmKGIuSGQoKSxiLnJkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5jZC5pbmRleE9mKGIpJiZ0aGlzLmNkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuaWEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5jZC5sZW5ndGg+PXRoaXMucGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5HZT90aGlzLkdlKys6dGhpcy5HZT0xOnRoaXMuRmU/CnRoaXMuRmUrKzp0aGlzLkZlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLktmKGIudmlkZW9UYWcpP2Iuc2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5uZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuRmU+dGhpcy5HZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlVnKCksYi5IZSgpLGIuc2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Banx8dGE7KGZ1bmN0aW9uKGMpe2MuQ2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5XbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpnLnNifHx0aGlzLk0oZyl8fHRoaXMuQ20oZyl8fCh0aGlzLk4oZyksZz1uZXcgdGEoZyx0aGlzLkYpLGcuSigpLGcuZigpKX19dGhpcy5QKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxXbDpmdW5jdGlvbigpe3ZhciBhPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQ2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLk1tfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOnRoaXMuWCgpKTp0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuVmQoYSl9LmJpbmQodGhpcykpfSxWZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5WJiZ0aGlzLlYoKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGcpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnZrfHx4YTsoZnVuY3Rpb24oYyl7Yy51az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuTWM9dGhpcy5CYT10aGlzLmpkPSExO3RoaXMuVGg9ZS5PYigxMCk7dGhpcy5SZj0hMDt0aGlzLnpjPXRoaXMudGg9ITE7dGhpcy5jbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSWgoKSx0aGlzLmZsKCksdGhpcy52YigpKX0sY246ZnVuY3Rpb24oYSl7cmV0dXJuIGUuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxycTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuamEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlcsIjsiLHR5cGVvZiBhLlcsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVz9hLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlc/dHlwZW9mIGEuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5HYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5HYT9hLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkdhP3R5cGVvZiBhLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5HYT9hLkcuR2EoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLkdhP3R5cGVvZiBhLkcuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5sZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmxlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEubWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5tZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS52ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS52ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcudmU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy52ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApLYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLkpjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sZ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5NYyl7dmFyIGE9dGhpcy5KYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLk1jPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5NYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLk1jfSxBbTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoKXt2YXIgYT10aGlzLkpjKCksYj10aGlzLnltKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuc2g9ITApfXJldHVybiB0aGlzLnNofSx5bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuamQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmpkPSEwKTtyZXR1cm4gdGhpcy5qZH0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuSG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sSG46ZnVuY3Rpb24oKXt0aGlzLnpjPSEwO3ZhciBhPXRoaXMuZ2goKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5IKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5BYz0hMDtlLkgoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuQWM9ITA7aWYoZS5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuQWM9ITA7ZS5IKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5BYz0hMDtlLkgoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkFjPSEwO2UuSCgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuS2cmJmEuYWRzJiYodGhpcy5LZz1hLmFkcyk7cmV0dXJuIHRoaXMuS2d9LGZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5tYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5KaCgpfS5iaW5kKHRoaXMpKX0sdGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuSWEmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmdoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRkKCl9LmJpbmQodGhpcyksNTApKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQW0oKSl7dmFyIGI9dGhpcy5KYygpLGc9dGhpcy5LYygpO2ImJmcmJih0aGlzLnpjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudGg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkpjKCksYT10aGlzLktjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnRoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmCmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGdsOmZ1bmN0aW9uKCl7dGhpcy5GY3x8KHRoaXMuRmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkZjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuRmM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuRmMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5GYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2woKX0uYmluZCh0aGlzKSwxMCl9LAp0YjpmdW5jdGlvbigpe3JldHVybiBlLkRlPyExOnRoaXMudmF9LERhOmZ1bmN0aW9uKCl7aWYodGhpcy5xbSgpKXt0aGlzLnZhPSEwO2lmKGUuSCgiZ2lnYS5kZSIpfHxlLkgoInNwaWVsZXRpcHBzLmRlIil8fGUuSCgia2luby5kZSIpfHxlLkgoImRlc2lyZWQuZGUiKSl0aGlzLlJmPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scW06ZnVuY3Rpb24oKXtpZigwPD1lLlVhKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZS5IKCJnaWdhLmRlIil8fGUuSCgic3BpZWxldGlwcHMuZGUiKXx8ZS5IKCJraW5vLmRlIil8fGUuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkVkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuU2woKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLkRlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpPyh0aGlzLncoKSx0aGlzLmlhKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlJmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlJmLGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxvbDpmdW5jdGlvbigpe3RoaXMuaHF8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2woKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy51a3x8eWE7KGZ1bmN0aW9uKGMpe2Mud2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2ddKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLk1lKGIpKXthPWI7Zm9yKHZhciBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGI9bmV3IHhhKGFbZ10pLGIuZ2F8fHRoaXMuTShiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5UYyl9fSl9KShjKTsKdmFyIHphPWMud2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLk5qfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5mPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5YKCk7cmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8CihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLlgoKX0sc246ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JYixnPXRoaXMuamEoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIubWMmJigwPD1nLmluZGV4T2YoZCl8fGIuSGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLm5mPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sdWE6ZnVuY3Rpb24oKXt0aGlzLm5mKys7aWYoMTA8dGhpcy5uZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LExhOmZ1bmN0aW9uKCl7fSxWZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7CnZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5JZSlpZih0aGlzLktifHwodGhpcy5LYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLktiKyssMTU8dGhpcy5LYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLkllPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy50YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLkspLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx0YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZz0hMDtnfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBnfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLkJhKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5KbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkpsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Euc24oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiYKd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBSKGFbYl0pO2cuZ2F8fHRoaXMuTShnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy5Cbnx8RmE7bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLmRoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudW49YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLnVuKXtjYXNlICJiZWZvcmUiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZywKYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVShnKTt0aGlzLndkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy53ZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMud2QpfSxrYTpmdW5jdGlvbigpe3JldHVybiEwfSxubDpmdW5jdGlvbigpe2UueWgodGhpcy53ZCk7ZS5WZSh0aGlzLndkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sYWY6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBHYT1jLnlqfHxHYTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLApiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIEhhPWMueGp8fEhhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLmRoKGEsImVsZW1lbnRJRCIpO2lmKGUueWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5NKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuVmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuVmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhLEphPW5ldyBJYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBLYT0KYy5Eanx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnNqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sT2s6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy5zanx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCxmLGMpe3RoaXMuRWE9Yjt0aGlzLllnPXRoaXMuRWk9ITE7dGhpcy5LaD1kO3RoaXMuaWk9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuRWE9bmV3IEMoYikpO3ZhciBoPQp0aGlzLmpiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbSYmbS5ZZSh0aGlzLkVhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2YmJjQhPWgucmVhZHlTdGF0ZSYmZihoKX0uYmluZCh0aGlzKX1jLnRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBiKXt2YXIgYT1iLGI9IiIsZDtmb3IoZCBpbiBhKWIrPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLllnJiYoYis9CiImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5qYi51cmxDYWxsZWQ9dGhpcy5FYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5qYi5vcGVuKHRoaXMuRWEubWV0aG9kLHRoaXMuRWEudXJsLCExKTp0aGlzLmpiLm9wZW4odGhpcy5FYS5tZXRob2QsdGhpcy5FYS51cmwsITApLHRoaXMuRWl8fCh0aGlzLmpiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5qYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5qYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5qYi5zZW5kKGIpfWNhdGNoKGYpe2I9dGhpcy5FYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8dGhpcy5FYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpLG0mJm0uWWUodGhpcy5FYS51cmwpJiYKIWI/ZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOm0uWWUodGhpcy5FYS51cmwpLHRoaXMuS2gmJnRoaXMuS2goKX1yZXR1cm4gdGhpcy5qYn19fSkoYyk7dmFyIExhPWMudGp8fExhOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5GYT10aGlzLmllPSExfWMuYWo9YTthLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxhbzpmdW5jdGlvbihiKXt0aGlzLkZhPWJ9LE1uOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3hwOiJBZENsaWNrVGhydSIsenA6IkFkRXJyb3IiLEFwOiJBZFN0b3BwZWQiLERwOiJBZExpbmVhckNoYW5nZSIsRXA6IkFkVGFnUGFyc2VkIixIcDoiQWRWaWRlb0NvbXBsZXRlIixLcDoiQWRMb2FkZWQiLExwOiJBZFNraXBwZWQiLE1wOiJBZFN0YXJ0ZWQiLEJwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsQ3A6IkFkSW1wcmVzc2lvbiIsCnlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLmllLGFbZF0pfSxMbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuRmEmJnRoaXMuRmEuaGUpZm9yKHZhciBhIGluIHRoaXMuRmEuaGUpdGhpcy5GYS5oZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkZhLHRoaXMuRmEuaGVbYV0pO3RoaXMuRmEmJnRoaXMuRmEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuRmEuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmllJiYKdGhpcy5NbigpO3RoaXMuRmEmJnRoaXMuTG4oKX19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5JYT0hMTt0aGlzLmJjPSIiO3RoaXMua2Q9dGhpcy5hYz10aGlzLmxiPW51bGw7dGhpcy5RZz10aGlzLndiPXRoaXMuJGU9ITE7dGhpcy5BYT0iIjt0aGlzLlplPSExO3RoaXMucWE9dGhpcy5MYz0iIjt0aGlzLlVlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnRmPSExO3RoaXMuaGE9W107dGhpcy5RZT10aGlzLlJiPSIiO3RoaXMuZmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5lZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMueWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuWWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuU2I9IiI7dGhpcy5UYj1bXTt0aGlzLlViPVtdO3RoaXMuWGM9W107CnRoaXMucWM9IiI7dGhpcy5EYj0hMTt0aGlzLlVkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubGM9ITE7dGhpcy5GZz10aGlzLiRkPW51bGw7dGhpcy5HZj10aGlzLmhiPXRoaXMuUGc9dGhpcy5ZZD10aGlzLlNmPXRoaXMubWQ9dGhpcy51Yz0hMTt0aGlzLiRhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkJkPTA7dGhpcy5vaD0hMTt0aGlzLm5oPTFFMzt0aGlzLkJjPSExO3RoaXMuUGE9MUUzO3RoaXMuZGQ9dGhpcy5lZD0iIn1jLnVqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLklhLGFkdGFncGFyYW1ldGVyOnRoaXMuYmMsYWR0YWdtb2RpZmllcjp0aGlzLmxiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5hYyxhZHRhZ3JlZ2V4OnRoaXMua2QsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuJGUsc2lkZWxvYWRzOnRoaXMud2IsZGlzYWJsZXRlc3RzOnRoaXMuUWcsaG9tYWRBbGlhczp0aGlzLkFhLAppc0luaXRpYWxpemVkOnRoaXMuWmUsZ2xvYmFsQ29uZmlnOnRoaXMuTGMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLlVlLHNlcnZlcjp0aGlzLmhhLHN2bUNvbmZpZzp0aGlzLlJiLGhvbWFkQWRwYXRoOnRoaXMuUWUsSE9NQURfVkVSSUZJRUQ6dGhpcy5mZSxIT01BRF9CTE9DS0VEOnRoaXMuZWUsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMuWWIsdGVzdEhpZGU6dGhpcy5TYix0ZXN0VGFnczp0aGlzLlRiLHRlc3RUYWdzSlM6dGhpcy5VYix0ZXN0VGFnc1hIUjp0aGlzLlhjLHRlc3QzUENvb2tpZTp0aGlzLnFjLHRocm90dGxlOnRoaXMuVWQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5sYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkZnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMudWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1kLAp1c2VTdHJpY3RDaGVja3M6dGhpcy5TZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5ZZCxjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy55YSxzZXJ2ZXJJZDp0aGlzLnhmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5hYix2cGFpZDp0aGlzLmhiLHNraXBBbGxvd2VkOnRoaXMuR2Ysdm1hcHM6dGhpcy5YZixhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuQmMsYWRGYWxsYmFja1VSTDp0aGlzLmVkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5kZH19LFVuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLklhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLmJjPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMubGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYKKHRoaXMuYWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5rZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLiRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy53Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlFnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5aZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5MYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlVlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaGE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5SYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuUWU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuZmU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5lZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYKKHRoaXMueWI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5ZYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuU2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuVGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5VYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlhjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5xYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuVWQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmxjPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLkZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnVjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMubWQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuU2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5ZZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuJGE9Yi5jb25maWdGYWlsdXJlcyk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy54Zj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmFiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuaGI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuR2Y9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuWGY9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5CYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuZWQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5kZD1iLmFkRmFsbGJhY2tDb25maWcpfSxubTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2FdJiYxPT10aGlzLiRhW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LHpmOmZ1bmN0aW9uKGIpe3RoaXMuJGFbYl09ITB9LFhsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYV0mJjE9PXRoaXMuJGFbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sU2Q6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKYj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk9iKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWUuWmsoYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZj0iIixjPSIiLGU9IiIsaD0iIjtpZighdGhpcy5JYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2Y9dGhpcy5YZShiKTtjPXRoaXMuYWEoYik7Zj8odGhpcy5OYygpP2U9YjplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5TYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLmJjfHx0aGlzLmxifHx0aGlzLmFjfHx0aGlzLmtkKSYmKGg9dGhpcy5hbihoKSk7Yj1uZXcgQyhlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKToKdGhpcy5abChjLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5DYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LFhlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5OYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaGEmJnRoaXMuaGEubGVuZ3RoJiYwPHRoaXMuaGEubGVuZ3RoJiYoYT10aGlzLmhhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsCiIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxZZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLlhlKGIpO3JldHVybiBhfSxabDpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LENkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFbdGhpcy54Zl19LFNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DZCgpLGE9dGhpcy5FZigobmV3IERhdGUpLmdldFRpbWUoKSsKIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sR2g6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sJG06ZnVuY3Rpb24oYixhKXt2YXIgZD1lLmFhKGIpLGY9IiIsZj0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxCPTA7QjxoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy5HaChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pOwpoPVtdO2ZvcihsIGluIGYpaC5wdXNoKGwrIj0iK2ZbbF0pO2Y9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZj10aGlzLkdoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYW46ZnVuY3Rpb24oYil7dGhpcy5iYyYmKGIrPXRoaXMuYmMpO2lmKHRoaXMubGIpZm9yKHZhciBhIGluIHRoaXMubGIpdGhpcy5sYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5sYlthXSkpO3RoaXMuYWMmJihiPXRoaXMuJG0oYix0aGlzLmFjKSk7cmV0dXJuIGJ9LG1sOmZ1bmN0aW9uKCl7dGhpcy55YSYmdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLmhsKHRoaXMueWEuY2xpZW50QVBJcyl9LGhsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmCmEuYm8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmFvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZixjLGUpe209dGhpczt0aGlzLlplPSEwO3RoaXMuTGM9Yjt0aGlzLnFhPWE7dGhpcy50Zj1kO3RoaXMuJGQ9Zjt0aGlzLmdjPWM7dGhpcy55YT1lfHx7fTt0aGlzLm1sKCk7dGhpcy5RbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLk9tKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkRjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuRGMoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sdWI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxRbTpmdW5jdGlvbigpe3RoaXMuSmEobmV3IEModGhpcy5MYyt0aGlzLnRlKCJnbG9iYWwiKSksdGhpcy5sbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy56ZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkRjKCl9LmJpbmQodGhpcyksITApfSxPbTpmdW5jdGlvbigpe3RoaXMuSmEobmV3IEModGhpcy5xYSt0aGlzLnRlKCJjbGllbnQiLC0xIT10aGlzLnFhLmluZGV4T2YoIj8iKSkpLHRoaXMuRGMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuemYoImNsaWVudCIpO3RoaXMuc2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LHRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ7ZD0oYT8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5PYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYKKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5tZCl7dGhpcy5tZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZyl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTsKZm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5nYz0hMSk7ImZvY3VzLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuZ2M9ITEpO3RoaXMuZ2MmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5nYz90aGlzLmdjKCk6KGEoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYSw1MDApKTt0aGlzLlM9dGhpcy5VZT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy5lZSkpO3RoaXMuV2IoKTtlLkhjKGsucW4pOyhhPWUuVWEodGhpcy5DZCgpKSl8fChhPWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpOwpifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxsbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZj0hMTt0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGY9ITApfWNhdGNoKGgpe31pZighKGZ8fGEuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUmJ8fAp0aGlzLkFhfHx0aGlzLkRjKCk6KHRoaXMuSWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy5XYigpKX19LERjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7dHJ5e3ZhciBjPWUuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihhPSEwKX1jYXRjaChoKXt9Yz1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8ZC5zZXJ2ZXIubGVuZ3RoO2IrKyl7dmFyIGE9ZC5zZXJ2ZXJbYl07dHJ5e3ZhciBnOyhnPXZvaWQgMD09PWEpfHwoZz0hYS5yZXBsYWNlKCJbaGFzaF0iLHRoaXMuRWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSkpO2lmKGcpcmV0dXJuITF9Y2F0Y2goZil7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmhhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5oYS5sZW5ndGg7YisrKXRoaXMuaGFbYl09dGhpcy5oYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuSCgid2ViLmRlIil8fGUuSCgiZ214Lm5ldCIpfHxlLkgoImdteC5hdCIpfHwKZS5IKCJnbXguY2giKXx8ZS5IKCIxdW5kMS5kZSIpKSYmIXRoaXMuTmMoKSlmb3IoYj0wO2I8dGhpcy5oYS5sZW5ndGg7YisrKXRoaXMuaGFbYl09dGhpcy5oYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5kZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5SYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuUWU9ZC5hZHBhdGh8fCIiO3RoaXMueGY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuaGEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5SYiYmdGhpcy5BYSYmdGhpcy5oYS5sZW5ndGg/dGhpcy5PYyghMSk6KHRoaXMuSWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy5XYigpKX0sY2k6ZnVuY3Rpb24oYil7dGhpcy5lZHx8KHRoaXMuZWQ9Ynx8CiIiKX0sT2M6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEModGhpcy5TYygpKSxkPXRoaXMuYWEodGhpcy5SYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQyh0aGlzLlJiK3RoaXMudGUoImN1c3RvbWVyIikpO3RoaXMuSmEoYSx0aGlzLndvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnpmKCJjdXN0b21lciIpO2I/dGhpcy5paz90aGlzLnNhKCJub1NWTUNvbmZpZyIpOih0aGlzLmlrPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5PYyghMCl9LmJpbmQodGhpcyksITApfX0sd286ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9CmIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5sYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubGM9ITA7dGhpcy5PYyghMCk7cmV0dXJufX1hPSExO3RyeXt2YXIgYz1lLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWlmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiYoZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGhpZGUiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFncyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzanMiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc3hociIpKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLlNmPXRoaXMuZ2IoZC5zdHJpY3QpO3RoaXMuWWQ9dGhpcy5nYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7CnRoaXMuUGc9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmFiPXRoaXMuZ2IoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmdiKGQuZW5hYmxlZCk7dGhpcy5TYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlViPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWGM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnFjPWQudGVzdDNwY29va2llfHwiIjt0aGlzLmJjPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMubGI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuYWM9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmtkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLiRlPWQuanNwb3B1cHN8fCExO3RoaXMud2I9ZC5zaWRlbG9hZHN8fCExO3RoaXMuaGI9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLmhiO3RoaXMuR2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5uZD1kLmNhcHRpb25fZHVyYXRpb258fAohMTt0aGlzLlhmPWQudm1hcHN8fCIiO3RoaXMuQmM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmRkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlVkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMubGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmxjPSEwLHRoaXMuT2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuSm8oKSYmKHRoaXMuU2J8fHRoaXMuVWJ8fHRoaXMuVGJ8fHRoaXMuWGMpP3RoaXMudGY/KHRoaXMuSWE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy55ZSgpLHRoaXMuV2IoKSk6dGhpcy56bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLk9mKCkpfX0sem86ZnVuY3Rpb24oKXt0aGlzLnlvKCk7dGhpcy5BbygpfSxBbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5ZKDEwKSxoPWUuWSgxMCksQj1lLlkoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQ2IoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS52ZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLkNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLnNhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxPZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuV2IoKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy51Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5JYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIoYikpLHRoaXMuV2IoKSx0aGlzLnllKCkpfSx5bzpmdW5jdGlvbigpe2lmKHRoaXMuU2Ipe3ZhciBiPWUudmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLkZtKCkpdGhpcy5UZCh0aGlzLlliLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuU2IpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5TYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlRkKHRoaXMuWWIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmxpKCl9fWVsc2UgdGhpcy5saSgpfSxNZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuT2IoKSksCnRoaXMuRG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLkxmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLkxmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlRkKHRoaXMuWWIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5UYj10aGlzLlhjKSYmdGhpcy5UYi5sZW5ndGgpe3ZhciBkPXRoaXMuVGIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5MZigpfSxEbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5KYShuZXcgQyhiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5PYigpKSx0aGlzLkVvKGYsMDxkLmxlbmd0aD9iLmJpbmQodGhpcyk6dGhpcy5NZi5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSl9Y2F0Y2goYyl7dGhpcy5NZigpfX1mdW5jdGlvbiBhKCl7dGhpcy5UZCh0aGlzLlliLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlViJiZ0aGlzLlViLmxlbmd0aCl7dmFyIGQ9dGhpcy5VYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLk1mKCl9LEVvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLnFjKXRyeXtlLkVkKHRoaXMucWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuRGI9IXRoaXMuZ2IoYS5jYyk7dGhpcy5PZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5qaSgpfWVsc2UgdGhpcy5PZigpfSxqaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuV2IoKTt0aGlzLnllKCl9LEZtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LApXYjpmdW5jdGlvbigpe3ZhciBhPSIwIixnPSIwIjt0cnl7ZS5DYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnVjJiYoZz0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitnLCEwKTt0aGlzLnFjJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuRGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLmZlKSk7dGhpcy4kZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLiRkJiZ0aGlzLiRkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkRifSl9LGxsOmZ1bmN0aW9uKCl7aWYodGhpcy5ZZCYmdGhpcy5ubSgpKXt2YXIgYT10aGlzLlhsKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZyl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPQphLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxKYTpmdW5jdGlvbihhLGcsZCxmLGMsaCl7dGhpcy5CZHx8KHRoaXMuQmQ9MCk7dGhpcy5CZCsrO3RoaXMuQmQ+dGhpcy5uaCYmIXRoaXMub2gmJih0aGlzLm9oPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5uaCwhMCkpO2E9bmV3IExhKGEsZyxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtmJiYoYS5FaT0hMCk7YyYmZS5EbSgpJiYoYS5ZZz0hMCk7aCYmKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0saWw6ZnVuY3Rpb24oKXt0aGlzLlltfHwodGhpcy5ZbT0hMCxlLkNhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LApmdW5jdGlvbihhKXt2YXIgZz1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihmPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGZbMF0mJihmPWZbMF0pLGYpe2Y9ZiYmZi5jaGlsZE5vZGVzJiZmLmNoaWxkTm9kZXNbMF0/Zi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLk5jKCl8fChmPXRoaXMuYWEoZiksZj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGQpe31lLm5ldHdvcmtTdGF0ZT09CmUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9ZS5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGcpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpO2UubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LAp4bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5YZn0samw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkphKGEsdGhpcy5Wby5iaW5kKHRoaXMpLHRoaXMuVW8uYmluZCh0aGlzKSl9LFZvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8CnRoaXMuSGwoKX0sVW86ZnVuY3Rpb24oKXt9LEhsOmZ1bmN0aW9uKCl7ZS5IYyhrLkdsKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx5ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMud2IubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy53YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5iYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZmEoKV09dGhpcztlLmJiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEpvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuVWR9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLAphfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxZOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBnPSIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxnYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxDYjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sYWE6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbZ1tmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sRWY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsZT1BcnJheSg4MCksaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZik7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1oO249aztxPWw7cj1tO3U9dDtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZxfH5uJnIpK3UrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7Zm9yKGY9MjA7Mzk+PWY7ZisrKXY9ZChjLDUpKyhuXnFecikrdStlW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1xLHE9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTQwOzU5Pj1mO2YrKyl2PWQoYyw1KSsobiZxfG4mcnxxJnIpK3UrZVtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZj02MDs3OT49ZjtmKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihnKGgpK2coaykrZyhsKStnKG0pK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLnVqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5MaXx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5lYj1hLmMuUigpOnRoaXMuZWI9IiI7YS5jLnZoJiZhLmMudmgoe3BhdXNlOnRoaXMuSGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy4kaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5oZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLlBvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEub2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5oYz10aGlzLmxkPSExO3RoaXMuWGs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9Zzt0aGlzLmliPXt9O3RoaXMudmlkZW89e307dGhpcy5RZD17fTtlLnJiKCJuZXdCaWdBZElkIik7dGhpcy4kaz1lLlkoMTApOwp0aGlzLklmPTA7dGhpcy5oZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmhkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmhkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlVrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUmM9dGhpcy5QZD0hMTt0aGlzLkVoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5zZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMubWM9ITE7dGhpcy53bD1lLlkoMTApO3RoaXMuTmI9ZS5ZKDEwKTt0aGlzLkxiPWUuWSgxMCk7dGhpcy5laT1lLlkoMTApO3RoaXMuY29uZj17fTt0aGlzLmFlPQp0aGlzLlhiPXRoaXMuQ2U9dGhpcy5zZD10aGlzLlJkPXRoaXMueGI9dGhpcy5zYz10aGlzLk5oPXRoaXMuQmU9dGhpcy54ZD10aGlzLktvPXRoaXMuQWI9dGhpcy5NYj0hMTt0aGlzLnhjPVtdO3RoaXMubmM9e307dGhpcy5tbj0yMDA7dGhpcy4kZj10aGlzLlljPXRoaXMuQ2M9dGhpcy5aZj10aGlzLnNmPSExO3RoaXMua2Y9e319Yy5vaj1hO2EucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBnfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMucG8oKTtlLm8oay5Mayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxjZjpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLkFiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLklmKyssZS5yYigibmV3U21hbGxBZElkIiksdGhpcy5BLmxsKCksYz1tLmdldENvbmZpZygpLGUuRGUmJih0aGlzLkEuVW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5JYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5yaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkVoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLnJpKCksCm5ldyBTKHRoaXMsYSx0aGlzLkVoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmhiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB2Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2Yy5jZihhLGcsZCl9LDUwKX19LG9mOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5hZT10aGlzLlhiPXRoaXMuQmU9dGhpcy54ZD0hMTt0aGlzLmI9YTt0aGlzLmpvKHRoaXMuYik7dGhpcy5qaChhKTt0aGlzLnhjPXRoaXMuJGcoYSk7dGhpcy5wbCgpfSxqaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5RZD10aGlzLmhtKGIpKSx0aGlzLmpoKGIucGFyZW50KSl9LCRnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy4kZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLlJsKGIpKSk7cmV0dXJuIGd9LFJsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5MJiZhLkwuZ2V0QXR0cmlidXRlKXtnPWEuTC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxobTpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuTCl7Zz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuTC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEucGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scmE6ZnVuY3Rpb24oYSl7YS5aYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS51ZCYmYS51ZC5lcnJvciYmYS51ZC5lcnJvci5jb2RlJiYoZz1hLnVkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuJGMuY29kZTpnPT1GLmplLmNvZGU/ZS5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZS5kZigpLGc9PUYuZGcuY29kZSYmZS5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7ZS5vKGsuRmwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnFvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuRGImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5EYiwhMCk7YnJlYWs7Y2FzZSB2LmJnLmNvZGU6ZS5vKGsuV28sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmUubyhrLnFwLAp0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5rZS5jb2RlOmUubyhrLnJwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuZ2UuY29kZTplLm8oay5lbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuY2UuY29kZTplLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuYWcuY29kZTplLm8oay5Ubyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLldhKCJ1bmtub3duIil9dGhpcy5pYyhhKTt0aGlzLlFhKCl9LGljOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTmEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5OYS5wb3AoKTt0aGlzLmJmKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxqbzpmdW5jdGlvbihhKXt0aGlzLkNlPSExO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5EZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmliLnpJbmRleD1nO2c9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC56ZCYmKGM9ZC56ZCgpKTtjLnZpZGVvU2xvdCYmKGc9Yy52aWRlb1Nsb3QsdGhpcy5zZj0KITApfWNhdGNoKGgpe31nLnNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5VayYmdGhpcy5wbGF5ZXIuSmUoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkplKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk8ubGVuZ3RoO2QrKylnLmNhblBsYXlUeXBlKGEuT1tkXS50eXBlKSYmCnRoaXMuUGsoZyxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLnNmJiZnLmxvYWQoKTtpZih0aGlzLm1pKGcpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlNrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5zZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuc2woKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXToKYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZyksdGhpcy5obygpKTp0aGlzLmIub3JpZ2luLlJnKHYuZ2UpfSxobzpmdW5jdGlvbigpe3RoaXMuWmY9ITA7dGhpcy54Yj10aGlzLnNjPSExO3RoaXMuYS5jLmthJiZ0aGlzLmEuYy5rYSgpJiYoZS5vKGsuSWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLnhiPSEwKTtlLnplKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm9hJiZlLlRrKHRoaXMuYi5vcmlnaW4ub2EpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5CO3RoaXMuYS5CPUQucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQixhKTt0aGlzLmEuT2goKTt0aGlzLmEuRmYoKTtmb3IoYT10aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYS5GZigpO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5EZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLnhiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuUWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLkRmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5rbSgpLGM9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmYi51cmwmJjA8PWIudXJsLmluZGV4T2YoIndlbGVjdC5qcyIpJiZ0aGlzLkEpe3ZhciBoPXRoaXMuQS5nZXRDb25maWcoKTtoJiZoLmFkRmFsbGJhY2tDb25maWcmJmguYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyYmKGM9SlNPTi5zdHJpbmdpZnkoaC5hZEZhbGxiYWNrQ29uZmlnKSl9dmFyIGs9Cntob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuRCwiY29uZmlnIixrKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsCmspfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUueGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIiwKdGhpcy5BKTt0aGlzLkQuc3JjPWE7ZS51ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlJkJiZ0aGlzLmEuYy51YSgpJiZlLm8oay5FYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5rYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy54Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZXAoKSx0aGlzLmEua2MoITApLCF0aGlzLlhiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSwKdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5YYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5hZT0hMDtlLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5XZSh0aGlzLlhiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEua2MoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmtjKCEwKSx0aGlzLm1wKCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtwKCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmxwKCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubnAoKTsiQWRWaWRlb0NvbXBsZXRlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLm5iKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UubyhrLkhnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5CY3x8dGhpcy5ZYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChkKXt3aW5kb3cub3BlbihoLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ocCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT0KYS5kYXRhLm5hbWUmJmUubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlljJiYodGhpcy4kZj0hMSx0aGlzLnBjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy54Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUWIoIm11dGVkIiwidXNlciIpLGUubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLnhiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5RYigidW5tdXRlZCIsCiJ1c2VyIiksZS5vKGsuUWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZS5vKGsucWUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtlLnVlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcykpO2UudWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEudWcoZnVuY3Rpb24oYSl7ZS5sYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMudHJhY2soInBhdXNlIik7ZS5vKGsub2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuc2M9ITB9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7CmEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5zYz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLmdpKCk7ZS5vKGsubGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sbXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWGEoInN0YXJ0Iik7ZS5vKGsuZmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sCmtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMueGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2UubyhrLm5nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtlLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMuVWYoKTt0aGlzLlhhKCJjb21wbGV0ZSIpfSxDaTpmdW5jdGlvbihhKXtpZih0aGlzLkQmJnRoaXMuRC5wYXJlbnROb2RlJiZ0aGlzLkQucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLldhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgZz0KdGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtnLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZyk7ZS56ZSgpO3RoaXMuRD0hMTt0aGlzLlFhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGc9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZyYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZz1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZy5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2UubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LFBrOmZ1bmN0aW9uKGEsZyl7ZnVuY3Rpb24gZChhLGIpe2lmKGIuSWEmJmIuaXNFbmFibGVkJiYhYi5OYygpKXt2YXIgZD1iLmFhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKYy5zcmM9ZChnLHRoaXMuQSk7Yy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChnLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sU2s6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5XZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5VZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlZmLmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5XZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5VZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlZmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGN8fHRoaXMuV2YoYSl9LmJpbmQodGhpcyksdGhpcy5YaykpfSxXZjpmdW5jdGlvbihhKXtpZighdGhpcy5sZCYmdGhpcy5taSh0aGlzLnZpZGVvKSYmIXRoaXMuTWImJiF0aGlzLmhjKXt0aGlzLmxkPSEwO3RyeXtpZighZS5DYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5iLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuTWJ8fCh0aGlzLk1iPSEwLHRoaXMuTGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5QZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUWEoKTtyZXR1cm59fWNhdGNoKGcpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5GZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy55ZygpO3RoaXMuYS5PaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5KZigpfX0sSmY6ZnVuY3Rpb24oKXt0aGlzLnNkfHx0aGlzLmpnKCl9LGpnOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMudmlkZW8ucGxheSgpO2lmKGcmJmdbImNhdGNoIl0pZ1siY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuc2R8fChhP3RoaXMuUWEoKToodGhpcy5oZighMCksdGhpcy5qZyghMCkpKX0uYmluZCh0aGlzKSk7CmNhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5vYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm9jLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm9jLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy5zZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuSmYoKSl9LmJpbmQodGhpcyk7dGhpcy5MZSgpLmRpKHRoaXMpfSxVZjpmdW5jdGlvbigpe3RoaXMuQS5hYiYmIXRoaXMuTWImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTt0aGlzLkJlPSEwO2UubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5RYSgpfSxNazpmdW5jdGlvbihhKXtmb3IodmFyIGc9W10sZD0hMSxjPTA7YzxhLmxlbmd0aDtjKyspZD1lLmVoKGFbY10pLApnLnB1c2goZCk7YT17aGFzaGVzOmd9O2E9ay5TYShhLHRoaXMudSgpKTtlLm5vKGEpfSxRYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5iZSYmdGhpcy5Nayh0aGlzLmIuYmUpO2lmKCF0aGlzLkNlKWlmKHRoaXMuQ2U9ITAsdGhpcy5hZXx8KGUubyhrLmhuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnpifHx0aGlzLmIudmMpe2UucmIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuSWYrKzt0aGlzLmhjPXRoaXMubGQ9ITE7dHJ5e3RoaXMuTGQodGhpcy52aWRlbyl9Y2F0Y2goZyl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5pYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChjKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLlBkPSExO3RyeXt0aGlzLmEudmkoKX1jYXRjaChoKXt9dGhpcy5SZD0hMDt0aGlzLmEuUGUoKTsKdGhpcy5tYz0hMTt0aGlzLkxlKCkuWWgoKTt0aGlzLmIuemImJnRoaXMuYi5vcmlnaW4uamYoKTt0aGlzLmIudmMmJihhP3RoaXMuYi5vcmlnaW4uSGgoKTp0aGlzLnJkKCkpfWVsc2UgdGhpcy5yZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkxkKHRoaXMudmlkZW8pLHRoaXMuVmYoYSkpfSxWZjpmdW5jdGlvbihhKXt0aGlzLmhjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5pbCgpO3RoaXMuYi5vcmlnaW4uUmcodi5nZSl9LEFpOmZ1bmN0aW9uKCl7aWYodGhpcy5Lbyl0aGlzLlFhKCk7ZWxzZXt0aGlzLm1jPQohMDt0aGlzLmEuYy51YSYmIXRoaXMuUmQmJnRoaXMuYS5jLnVhKCkmJmUubyhrLkVjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk5vKGEpO2lmKCF0aGlzLlhiKXt2YXIgZz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuWGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmFlPSEwO2UubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6ZyxwZXJjZW50OmQsCnN0YXJ0VGltZTohMX07ZS5XZSh0aGlzLlhiKX1kPSIiO3RoaXMuYi5IZiYmKGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuSGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuUGR8fCh0aGlzLlBkPSEwLGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLnpiPyh0aGlzLmhjPXRoaXMubGQ9ITEsdGhpcy5MZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLlBkPSExLHRoaXMuYS52aSgpLHRoaXMuYi5vcmlnaW4uamYoKSk6CnRoaXMuUWEoKX0uYmluZCh0aGlzKSkpKSxnLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuaGQucmVwbGFjZSgiW3RpbWVdIixlLlpnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMuc2U9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5OaHx8KHRoaXMuTmg9ITAsdGhpcy54ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE5vOmZ1bmN0aW9uKGEpe2UubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5NYnx8KDA9PWEmJih0aGlzLkFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLkFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5EYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsCmZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5NYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmFiJiZ0aGlzLlhhKCJzdGFydCIpLGUubyhrLmxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZS5vKGsucWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYWImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy54ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmlnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PQpNYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5hYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUubyhrLm5nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYWImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGcpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxnLCEwKX0scG86ZnVuY3Rpb24oKXtlLldkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LApnaTpmdW5jdGlvbigpe2UuV2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scW86ZnVuY3Rpb24oKXtlLldkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7ZS5XZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5aZnx8dGhpcy5BLmFiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFFiOmZ1bmN0aW9uKGEsZyl7dGhpcy5BLmFiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsZywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZyl7aWYoIXRoaXMuTWIpe3RoaXMua2YmJnRoaXMua2YudHJhY2smJnRoaXMua2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLkRlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwKImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5pbSh0aGlzLmIuTmEsYSl9Y2F0Y2goYyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkNjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuUWQuaW1wcmVzc2lvbnMmJmUuQm0oaC51cmwsdGhpcy5RZC5pbXByZXNzaW9ucyk/dGhpcy5iZihoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuUWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5iZihoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZyl0cnl7dGhpcy5iLk5hPXRoaXMuemwodGhpcy5iLk5hLGEpfWNhdGNoKEIpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWUuQ2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYz0iIjt0aGlzLlpmJiYoYz0iX3ZwYWlkIik7dGhpcy5ZYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxiZjpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQS53YShhKSxkJiZjLk9rKGQpLGZ8fChmPXRoaXMuT2cpLGV8fChlPXRoaXMuT2cpLHRoaXMuUWsoYSksdGhpcy5BLkphKGMsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFFrOmZ1bmN0aW9uKGEpe3RoaXMubmNbYV09Im9wZW4ifSxYaDpmdW5jdGlvbihhKXt0aGlzLm5jW2FdPSJjbG9zZWQifSxwbDpmdW5jdGlvbigpe3RoaXMubmM9Cnt9fSxzbzpmdW5jdGlvbigpe3ZhciBhPTAsYztmb3IoYyBpbiB0aGlzLm5jKXRoaXMubmMuaGFzT3duUHJvcGVydHkoYykmJiJvcGVuIj09dGhpcy5uY1tjXSYmYSsrO3JldHVybiBhfSxpbTpmdW5jdGlvbihhLGMpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1jfSl9LHpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS50ZyYmYS50Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZS5DYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5wYygpO2Vsc2UgaWYodGhpcy5iLm5iKXt0cnl7dmFyIGE9KG5ldyBEYXRlKS5nZXRUaW1lKCk7CnRoaXMuYi5BZXx8KHRoaXMuYi5BZT0xKTtpZigxMDA+YS10aGlzLmIuQWUpcmV0dXJuO3RoaXMuYi5BZT1hfWNhdGNoKGMpe31lLm8oay5IZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuQmN8fHRoaXMuWWMpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIubmJ9Y2F0Y2goYyl7YT13aW5kb3cub3Blbih0aGlzLmIubmIsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5uYiwiX3RvcCIpfWNhdGNoKGcpe3dpbmRvdy5vcGVuKHRoaXMuYi5uYiwiX3RvcCIpfX19LmJpbmQodGhpcyksNTAwKX19LFhvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmhkLnJlcGxhY2UoIlt0aW1lXSIsZS5aZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5BLm5kJiYoYz10aGlzLkEubmQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmIuYmluZCh0aGlzKSwKMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sRmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5uZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sTmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5uZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFlLktmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy53bDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYygpO3RoaXMuTmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IiwKZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYygpO3RoaXMuTmQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOgooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkxiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkxvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucGMoKTt0aGlzLk5kKCl9LmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLmVpO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuSGYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuQ2EoKXx8Cih0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnBjKCk7dGhpcy5OZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLApkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS51ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLklnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5oZigpKTt0aGlzLkdiKCl9fSxHYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHBjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLiRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5mZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLm9lLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLnNjPyhlLmxhKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuc2M9ITEpOihlLmxhKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5zYz0hMCl9LEhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsub2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5mZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlFiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLlFmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUWIoIm11dGVkIiwidXNlciIpLGUubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxNbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpOwp0aGlzLnhiPyhlLmxhKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMueGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMueGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0saGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5RYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuRmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFBvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlFiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLlFmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxvYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLm9jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm9jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5vYyk7dGhpcy5zZHx8dGhpcy5zZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuSmYoKSl9LHJkOmZ1bmN0aW9uKCl7dGhpcy5LbSgpJiZ0aGlzLkptKCkmJih0aGlzLkEudWN8fCJzcGllZ2VsLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuSmImJnRoaXMuT28oKXx8KHRoaXMuc2Q9ITAsdGhpcy5BYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5BYj0hMSksdGhpcy5KZygpKX0sS206ZnVuY3Rpb24oKXt2YXIgYT1lLnZkKCk7aWYoIXRoaXMuQS5oYnx8ZS5DYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGM9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuQ2EoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsYytkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LEptOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuUmN8fChhPQohMCxjLmFkRmFsbGJhY2tVUkx8fChjLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkNjJiZjLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5SY3x8ZS50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuQ2M/ImFueSI6IiIpKyhjLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5SYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuQ2MmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlJjfSxZbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sT286ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgYz1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoYy5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmMuYXZhaWxhYmxlKXtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgZz1lLnhnKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoZylyZXR1cm4gdGhpcy5jZihnLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy5yZCgpfXZhciBjPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuWWwoKTt0aGlzLkNjPXRoaXMuUmM9dGhpcy5ZYz10aGlzLiRmPSEwO3JldHVybiBjPyhlLmJiKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2MsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LEpnOmZ1bmN0aW9uKGEpe3RoaXMuc28oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpnKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5tbik6KHRoaXMuUmQ9ITAsdGhpcy5hLlBlKCksdGhpcy5hLlJuKCksdGhpcy5tYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkJlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGUubyhrLnZsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5MZSgpLlloKCkpfSxMZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEoIm1pblZpcyIpO2EmJihlLlZlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuSGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5uYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi56Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy54YyYmMDx0aGlzLnhjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy54YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy4kaysiLSIrdGhpcy5JZjt0aGlzLmImJnRoaXMuYi5maCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZmgoKSk7cmV0dXJuIGF9LE9nOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5vanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5Hb3x8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubmE9bnVsbDt0aGlzLlc9W107dGhpcy5MPW51bGw7dGhpcy53Yz10aGlzLnljPSExO3RoaXMub2E9IiI7dGhpcy5ZZj0hMTt0aGlzLnFoPSIiO2QmJmQuZW1wdHk/dGhpcy5UbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLnNrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnZkKCksYjtiPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOm0ud2EobS5TZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihlLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuSCgiZmFuZG9tLmNvbSIpfHxlLkgoImdpZ2EuZGUiKXx8ZS5IKCJraW5vLmRlIil8fGUuSCgic3BpZWxldGlwcHMuZGUiKXx8ZS5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8ZygpKXt2YXIgaD1lLkxnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGc9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxsPWZ1bmN0aW9uKCl7cmV0dXJuKGUuSCgiZ2lnYS5kZSIpfHxlLkgoImtpbm8uZGUiKXx8ZS5IKCJzcGllbGV0aXBwcy5kZSIpfHxlLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZygpfHxrKCl8fGwoKXx8ImFwcHNwb3QiPT1jKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLlNkKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLlNkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZS50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bS53YShtLlNkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5KYShiLHRoaXMuU20uYmluZCh0aGlzKSx0aGlzLlBtLmJpbmQodGhpcykpfSxhaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5uYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkpiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5KYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuSmJ8fHRoaXMuSG0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0ueG8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSG06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxTbTpmdW5jdGlvbihhKXt0aGlzLnpuKGEpO3RyeXt0aGlzLm5hPWEucmVzcG9uc2VYTUwsdGhpcy5uYXx8KHRoaXMubmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2LmtlKSl9dGhpcy5XPXRoaXMuYWgoKTt0aGlzLnljPXRoaXMuTmYoKTt0aGlzLndjPXRoaXMua2koKTt0aGlzLnFoPWEudXJsQ2FsbGVkO2lmKHRoaXMuVy5sZW5ndGgpdGhpcy5RYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlJhKHYuJGMse2Vycm9yOnRoaXMuWWY/Ri5qZTpGLmNnfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuVWEodGhpcy5vYSksITApfWNhdGNoKGMpe319fSxUbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5uYXx8Cih0aGlzLm5hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2LmtlKSl9dGhpcy5XPXRoaXMuYWgoKTt0aGlzLnljPXRoaXMuTmYoKTt0aGlzLndjPXRoaXMua2koKTt0aGlzLlcubGVuZ3RoP3RoaXMuUWMoKTp0aGlzLnJhKHRoaXMuUmEodi4kYyx7ZXJyb3I6dGhpcy5ZZj9GLmplOkYuY2d9KSl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlJhKHYuYmcse2RlcHRoOmJ9KSl9LFFjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuVy5zaGlmdCgpO3RoaXMuTG0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMua2goKSxnLHtBZFN5c3RlbTp0aGlzLlFsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMub2YodGhpcy55bCgpKSl9LGpmOmZ1bmN0aW9uKCl7dGhpcy55Yz8odGhpcy55Yz0xPHRoaXMuVy5sZW5ndGgsCnRoaXMuVy5sZW5ndGgmJnRoaXMuUWMoKSk6dGhpcy5wYXJlbnQuamYoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLlFjKCkpOnRoaXMucGFyZW50LkhoKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLkljKCk/dGhpcy5yYSh0aGlzLlJhKHYuY2UpKTp0aGlzLnJhKHRoaXMuUmEodi5hZykpLCExKToodGhpcy5yYSh0aGlzLlJhKHYuJGMsRi5kZykpLCExKX0sb2Y6ZnVuY3Rpb24oYSl7dGhpcy5vYXx8KHRoaXMub2E9IiIpO2EuYmV8fChhLmJlPVtdKTthLmJlLnB1c2godGhpcy5xaCk7YS5OYT1hLk5hLmNvbmNhdCh0aGlzLmVmKCkpO2EuemI9YS56Yj9hLnpiOnRoaXMueWM7YS52Yz1hLnZjP2EudmM6dGhpcy53YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5vYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuWGc7dGhpcy5wYXJlbnQub2YoYSl9LAp5bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5kdXJhdGlvbj10aGlzLkljKCk7YS5PPXRoaXMuaGgoKTthLm5iPXRoaXMuVGwoKTthLnpxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUGwoKTthLkhmPXRoaXMuZ20oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlhnO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlhnO2lmKCF0aGlzLkwmJnRoaXMubmEmJnRoaXMubmEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLkw9dGhpcy5uYTt0cnl7aWYodGhpcy5MJiZ0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5OYT1hLmVycm9yLmNvZGUhPXYuY2UuY29kZT9hLk5hLmNvbmNhdCh0aGlzLlVsKCkpOmEuTmEuY29uY2F0KHRoaXMuY20oKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5pYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmljJiZ0aGlzLnBhcmVudC5pYyhhKSxiPTAsdGhpcy5RYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGljOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmljKGEpfSxSZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaGgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5JYygpfSxOZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5OZigpJiYoYT0hMCk7cmV0dXJuIGF9LHpuOmZ1bmN0aW9uKGEpe3RoaXMub2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5vYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm9hPSJVTktOT1dOIn10cnl7dGhpcy5ZZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMbTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmtoKCkubGVuZ3RofSxraDpmdW5jdGlvbigpe3JldHVybiB0aGlzLktlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFFsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2UodGhpcy5MLCJBZFN5c3RlbSIpfSxlZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnhoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnBiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMueGgoYS5wYXJlbnROb2RlKTohMX0sY206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sVWw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUGE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxVcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5wYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5QYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5QYSktTWF0aC5hYnMoZC1iLlBhKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxQbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5BZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sSWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5wYih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGdtOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUubW8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sS2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnBiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxOZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0scGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5BZChhKToiIn0sQWQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5OZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuc2t8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5Wa3x8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5PPVtdO3RoaXMubmI9IiI7dGhpcy5zPXRoaXMudmM9dGhpcy56Yj0hMTt0aGlzLlJlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5TZT0iIn1jLllqPWE7YS5wcm90b3R5cGU9e3NsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTy5sZW5ndGg7YysrKWlmKDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGFtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5uYSl7dmFyIGE9dGhpcy5vcmlnaW4ubmE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5SZT1hW2RdKX1yZXR1cm4gdGhpcy5SZX0sCmZoOmZ1bmN0aW9uKCl7aWYodGhpcy5TZSlyZXR1cm4gdGhpcy5TZTt2YXIgYT0iIjsoYT10aGlzLmFtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5TZT1hfSxrbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk8ubGVuZ3RoO2MrKylpZigwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuWWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuc3B8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtrZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixNYToiWE1MX1BBUlNFX0VSUk9SIn0sYWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixNYToiRFVSQVRJT05fRVJST1IifSwkYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTWE6IkVNUFRZX1ZBU1QifSxlZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixNYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sYmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk1hOiJMT0FEX0VSUk9SIn0sZ2U6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE1hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTWE6Ik1FRElBRklMRV9FUlJPUiJ9LGNlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE1hOiJEVU1NWV9BRCJ9fSxGPXtjZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE1hOiJOT19BRFMifSxkZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTWE6Ik5PX01FRElBRklMRVMifSx2cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixNYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLnhrfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnVkPWM7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLmRqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5Xa3x8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1jO3RoaXMuWmQ9W107dGhpcy5XaD1bXTt0aGlzLmxmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLndwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5aaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5vcT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Gbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlpkLnB1c2goe3NyYzpkLGZyYW1lOmgsbm46ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMubGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5sZltjXTtkLnR5cGU9PT1hJiZkLmNsKHRoaXMuVmwoYSkpfX0sVmw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7eHE6ITAsd3E6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7bHE6InZpZGVvIixBcToianNDdXN0b20iLEJxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQ3E6MSxWcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxqbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuWmQubGVuZ3RoO2MrKylpZih0aGlzLlpkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuWmRbY10ubm47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsYyl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5qbShjKSx2ZW5kb3I6Y30pO3RoaXMub28oKX0sRm46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnZnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMudmcoYSxjKX0sdmc6ZnVuY3Rpb24oYSxjKXt0aGlzLmxmLnB1c2goe3R5cGU6YSwKY2w6Yyx1cTohMX0pfSxvbzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuRW18fChhLm5xKHthZFNlc3Npb25JZDplLlkoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnlxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5FbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLm5rfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLm9iPWEuYmgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlkoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk9hPXt9O3RoaXMud2c9ITE7dGhpcy5kYz1bXX1jLmJqPWE7YS5wcm90b3R5cGU9e09sOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuT2woYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLnJtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSx2bzpmdW5jdGlvbigpe3RoaXMud2c9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5FYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLndnfHwodGhpcy5jLnBsYXkoKSxlLm8oay5xZCx0aGlzLmMubCgpKSl9LEZmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLm9iLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5vYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5vYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLm9iLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMub2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMub2IpO3RoaXMuYy5VYyYmdGhpcy5jLlVjKCk/dGhpcy5jLmJoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0scm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxNbDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGtjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuTWwodGhpcy5vYik7aWYoYy54IT10aGlzLk9hLnh8fGMueSE9dGhpcy5PYS55fHxjLnBvc2l0aW9uIT10aGlzLk9hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk9hLndpZHRofHxjLmhlaWdodCE9dGhpcy5PYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5PYS53aWR0aCYmMDx0aGlzLk9hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuUGUoKTtyZXR1cm59dGhpcy5PYT1jO3RoaXMuYy5VYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmRjLmxlbmd0aDthKyspdGhpcy5kY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLktmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2MuYmluZCh0aGlzKSwxMCl9LHVnOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLmRjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5kYy5wdXNoKGEpfSxQZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5ianx8WWEsRD1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5ZKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMua2p8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuTWQoYSk7dGhpcy5NZygpfSxNZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sTWc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlRhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5UYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLlNqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLiRiPXRoaXMuJGJ8fCExO3RoaXMubWc9dGhpcy5vZz10aGlzLnVoPXRoaXMudmE9dGhpcy5QZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLktsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnVoJiZ0aGlzLkVnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuSWI7YSYmYS5tYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5vZCgpO3RoaXMudWg9ITA7dGhpcy5FZygpfS5iaW5kKHRoaXMpKTt0aGlzLkFnKCl9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3RoaXMub2QoKTtpZighdGhpcy5QZiYmIXRoaXMub2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlBmJiZ0aGlzLm1nJiYhdGhpcy5vZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKX19LG9kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5paCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxpaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sQWc6ZnVuY3Rpb24oKXtpZih0aGlzLm9kKCkpe3ZhciBhPXRoaXMuaWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5vZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLm1nPWEuU3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMDApfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5qcSgpOiExfSxJYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuSWMoKTotMX0sZG06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LEtsOmZ1bmN0aW9uKGEsYil7dGhpcy4kYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLiRifHwzMDI9PXRoaXMuJGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuJGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmlhKCkpOmEuVGUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5kbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Sanx8YmI7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxHbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5iay5Iay5Gaz93aW5kb3cuT08uYmsuSGsuRmsuUXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5NZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLlRqfHxjYixkYj1uZXcgY2IodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5sbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMubG58fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuZ2E9ITE7dGhpcy5saCgpfSxsaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5VKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LExhOmZ1bmN0aW9uKCl7dGhpcy5SaCgpfSxSaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuViYmKDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLlNpfHxmYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5pYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmlhKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkJnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuQmcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLlJpfHxnYjsoZnVuY3Rpb24oYyl7Yy5UaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5NZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5MbHx8KHRoaXMuTGw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYixUPW5ldyBoYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLkRsfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxVYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cuZ2QoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3LmdkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuam4oYSl9LmJpbmQodGhpcykpO3cuZ2QoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5nZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubW0oKX0sam46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5HZCYmKGE9ZS5BbChhLHRoaXMuR2QpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5NKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkYpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkdkfHwodGhpcy5HZD1bXSksdGhpcy5HZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5NKGQpfHwodGhpcy5OKGQpLGY9bmV3IFYoZCx0aGlzLkYpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZ2Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwKKHRoaXMuYmFbYV09e30pO3RoaXMuYmFbYV1bYl18fCh0aGlzLmJhW2FdW2JdPVtdKTt0aGlzLmJhW2FdW2JdLnB1c2goYyl9LEhvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYmF8fHRoaXMuYmEmJiF0aGlzLmJhW2JdKXRoaXMuUGN8fCh0aGlzLlBjPVtdKSx0aGlzLlBjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy52ZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxtbTpmdW5jdGlvbigpe2lmKHRoaXMuUGMpZm9yKHZhciBhPTA7YTx0aGlzLlBjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuUGNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5iYVtjXVtkXSYmMDx0aGlzLmJhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYmFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmJhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5IbyhhKX19KX0pKGMpO3ZhciBqYj1jLm1rfHxqYix3PW5ldyBqYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMudGt8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9pPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuT2l8fGxiOyhmdW5jdGlvbihjKXtjLlBpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLlBpfHxtYjsoZnVuY3Rpb24oYyl7Yy5RaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTShoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRikpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkthKWlmKGI9PXRoaXMuS2FbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuS2FbYS5qYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYixvYj1uZXcgbmIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5janx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5HZz10aGlzLkdjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnFsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFsPSEwKTt2YXIgYj10aGlzLlRnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5HYz1iKTtpZighdGhpcy5HZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5HZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuemQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlUoYik7dGhpcy5Fbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTt0aGlzLmZjLnB1c2goYSl9LHJsOmZ1bmN0aW9uKCl7aWYodGhpcy5mYyYmdGhpcy5mYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdHJ5e3RoaXMuZmNbYV0oKX1jYXRjaChiKXt9fSx6ZDpmdW5jdGlvbigpe2lmKHRoaXMuR2MpcmV0dXJuIHRoaXMuR2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuVGcoYSkpcmV0dXJuIHRoaXMuR2M9YX19LFRnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRW46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLm11dGUmJnRoaXMuZWEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sdmg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy5Qanx8cWI7KGZ1bmN0aW9uKGMpe2MuT2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm1hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS56ZCgpPwp0aGlzLkMoKToodGhpcy5FZXx8KHRoaXMuRWU9MSksdGhpcy5FZSsrLDEwMDx0aGlzLkVlP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuUWo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLk0oYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgc2I9Yy5Ranx8c2IsVz1uZXcgc2IodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVsPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHRiPWMuRWx8fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LExhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuemt8fHViOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEtjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxDbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuaWEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy56Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkNuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuS2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy56Yyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmZiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmZiW2JdJiYzMDMhPXRoaXMuZmJbYl0mJjQwMyE9dGhpcy5mYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuaWEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMueWt8fHZiOyhmdW5jdGlvbihjKXtjLkFrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5NKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuQWt8fHdiLHhiPW5ldyB3Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmFsfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5VKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMucGY9ITF9LExhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnRuKCl9LmJpbmQodGhpcyksNTAwKX0sdG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5WJiZ0aGlzLlYoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMucGYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMucGYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxybzpmdW5jdGlvbigpe3RoaXMucGY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLmdrfHx6YjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMucmM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5yY3x8KHRoaXMucmM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5yY3x8dGhpcy5yYysrLHRoaXMucmM8PXRoaXMuWG0/KHRoaXMucmMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnJvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQWI9Yy5ma3x8QWI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBCYj1jLmhrfHxCYixDYj1uZXcgQmIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRGI9Yy53anx8RGI7bmV3IERiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5WKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuZWt8fEViOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubWEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMudGwoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5FYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuTm0oKTp0aGlzLkRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sdGw6ZnVuY3Rpb24oKXt0aGlzLmtnKCl8fHRoaXMuaSghMCl9LE5tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYigpOyFhLnBhJiZhLlcmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxEZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5pYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LEViOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGgpZm9yKHZhciBhPWMuYWQuRWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTGg9YVtlXSk7cmV0dXJuIHRoaXMuTGh9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5FYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLmRrfHxGYjsoZnVuY3Rpb24oYyl7Yy5hZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGtsOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBGYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmFkLkViKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5rbChhW2JdKTt0aGlzLlAoKX19KTtjLmFkLkViPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobCYmbC5wbGF5ZXJhcGkmJihhPWwucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5hZHx8R2IsSGI9bmV3IEdiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5aaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuWml8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVShiKTp0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxpcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApVYzpmdW5jdGlvbigpe3JldHVybiEwfSxUYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5xZj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnFmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMucWYmJmMhPXRoaXMucWZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGUuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEucHEpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuZ2E/dGhpcy52ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxKYj1jLk1qfHxKYixLYj1uZXcgSmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Jaj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBMYj1jLklqfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlUoYikpOnRoaXMuWCgpKTp0aGlzLlgoKTp0aGlzLlgoKTp0aGlzLlgoKX0sYmk6ZnVuY3Rpb24oKXt9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGduOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE1iPWMubWp8fE1iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMueGUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5tYSgpfS5iaW5kKHRoaXMpKX0seGU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy54ZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgTmI9Yy5sanx8TmI7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuZ2F8fHRoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLm5qfHwKT2IsUGI9bmV3IE9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Jbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFiPWMuSW98fFFiO25ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVShiKSk6dGhpcy5YKCkpOnRoaXMuWCgpfSxiaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxnbjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBSYj1jLlZpfHxSYjsoZnVuY3Rpb24oYyl7Yy5XaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLnhlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmlhKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFNiPWMuV2l8fFNiOyhmdW5jdGlvbihjKXtjLlhpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgYz1uZXcgUmIoYVtiXSk7Yy5nYXx8dGhpcy5NKGMpfHwodGhpcy5OKGMpLHdpbmRvdy5icmlkcGxheWVyPWMsKG5ldyBTYihjLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiLFViPW5ldyBUYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLk5pfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPQpiLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5VKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWCgpfSxYZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sRG46ZnVuY3Rpb24oKXt0aGlzLlpjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWmN8fCh0aGlzLlpjPSEwLHRoaXMuWGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlpjJiYodGhpcy5YZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlpjPSExKSx0aGlzLlhkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHVhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgV2I9Yy5Ea3x8V2I7KGZ1bmN0aW9uKGMpe2MuQ2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sVmg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5lYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmVjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuZWMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLlZoLmJpbmQodGhpcyksMTApfSxlYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSWs9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuaSgpKToodGhpcy5Ja3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuaSgpKX0saGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuZWMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhnLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmgoKTt0aGlzLmhnKCk7dGhpcy5HbigpfSxHbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmVjKGEpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLkFuP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLkFuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuZWMoYSkpfX0pfSkoYyk7dmFyIFhiPWMuQ2t8fFhiOyhmdW5jdGlvbihjKXtjLkVrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFdiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5nYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGEuRG4oKSxhPW5ldyBYYihhLHRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgWWI9Yy5Fa3x8WWIsWmI9bmV3IFliKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMua249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciAkYj1jLmtufHwkYjtuZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5waz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLlBoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLmJuPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5YKCl9ZWxzZSB0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxiaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ibn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuVmQoYSl9LmJpbmQodGhpcykpfSxWZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5QaCYmKHRoaXMuUGg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgTj1jLnBrfHxOOyhmdW5jdGlvbihjKXtjLm9rPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5JZSlpZih0aGlzLktifHwKKHRoaXMuS2I9MCksdGhpcy5LYisrLDE1PHRoaXMuS2Ipe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuZW8oKTp0aGlzLmkoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuaSgpOnRoaXMuaSghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkllPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy50YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLkspLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHRiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLks9YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz0KcS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVmE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5nYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKSk7dGhpcy52ZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGFjPWMucWt8fGFjLGJjPW5ldyBhYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBjYz1jLk1pfHxjYztuZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Haj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLkdqfHxaOyhmdW5jdGlvbihjKXtjLkZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnJoPTA7dGhpcy5LPXRoaXMuS3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuTWM9dGhpcy5CYT10aGlzLmpkPSExO3RoaXMuVGg9ZS5PYigxMCk7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5wYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnZiKCksITA7dGhpcy5yaCsrO2lmKDEwPHRoaXMucmgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuaSghMCk6dGhpcy5pKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy56aC5iaW5kKHRoaXMpLDEwMCksITF9LHZiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmIoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnZhPQohMH0sY2E6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCk/KHRoaXMudygpLHRoaXMuaWEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Ganx8YWE7KGZ1bmN0aW9uKGMpe2MuSGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLAp0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5Ianx8ZGMsZWM9bmV3IGRjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMucmt8fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLApiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlUoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5YKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGdjPWMuaWp8fGdjOyhmdW5jdGlvbihjKXtjLmhqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLkNnKCl9LENnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgaGM9Yy5oanx8CmhjOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBnYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5nYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLk0oYSkpe3RoaXMuTihhKTsobmV3IGhjKGEsdGhpcy5GKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgaWM9Yy5qanx8aWMsamM9bmV3IGljKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMudW18fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5HaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5VKGEpOnRoaXMuWCgpKTp0aGlzLlgoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGxjPWMuR2l8fGxjOyhmdW5jdGlvbihjKXtjLkZpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLndlKCk7dGhpcy56ZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSx0YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxEYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LHpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChhPWEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmEuYWRzTG9hZGVyKWZvcih2YXIgYj0wO2I8YS5hZHNMb2FkZXIubGVuZ3RoO2IrKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMuaWEoKSk6dGhpcy5pKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy56Zy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLndlLmJpbmQodGhpcyksMTAwKX0sd2U6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuaSgpOnRoaXMuaSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy53ZS5iaW5kKHRoaXMpLDEwMCl9fSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWEuYmluZCh0aGlzKSwxRTQpO3RoaXMuQyhhKX19KX0pKGMpO3ZhciBtYz1jLkZpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFNhOmZ1bmN0aW9uKGEpe2E9Cm5ldyBsYyhhKTthLmdhP3RoaXMuUCgpOnRoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IG1jKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlNhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5TYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBuYz1jLkhpfHxuYyxvYz1uZXcgbmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGM9Yy5DbHx8cGM7bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkFoPXRoaXMuQ2g9dGhpcy5CaD0hMTt0aGlzLklkPVtdO3RoaXMudWY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHc/bnVsbDp3LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBaYj9udWxsOlpiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLEJyaWRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWI/bnVsbDpVYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEphP251bGw6SmEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9jP251bGw6b2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLiRqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuZW0oYSk6W10sYzt0aGlzLkNoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkJoPQohMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sdGhpcy5haShjKX1lbHNlIGZvcihkIGluIHRoaXMudWYpe2lmKHRoaXMuQWgpYnJlYWs7Yz10aGlzLnVmW2RdO3RoaXMuVGYoYykmJih0aGlzLklkLnB1c2goYyksdGhpcy5haShjKSl9fSxUZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHE/ITA6ITF9LGVtOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYztmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkPWFbZV0sZD10aGlzLnVmW2RdLHRoaXMuVGYoZCkmJmMucHVzaChkKTtyZXR1cm4gY30sYWk6ZnVuY3Rpb24oYSl7dGhpcy5UZihhKSYmYS5mKCl9LHRvOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiByJiYhdGhpcy5CaClmb3IodGhpcy5BaD0hMCxhPTA7YTx0aGlzLklkLmxlbmd0aDthKyspdGhpcy5JZFthXS5WYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLklkW2FdLlZiKX19fSkoYyk7dmFyIHFjPQpjLiRqfHxxYyxMPW5ldyBxYztMLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYz1jLlZtfHxyYztuZXcgcmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGE9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1hLmluZGV4T2YoImhvbWFkIil8fC0xIT1hLmluZGV4T2YoImhkLW1haW4iKSlhPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWEuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1hLnN1YnN0cmluZyhhLmluZGV4T2YoIjoiKSsxLGEuaW5kZXhPZigiaXMgbm90IiktCjEpLGUuSGMoay5SbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuSGMoay5mbiksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciB3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHVjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLGw9ITE7SC5mYSgpO0gud2goKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmZhKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC53aCgpLApmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtILmZhKCk7dmFyIHhjPXdjKGZ1bmN0aW9uKCl7ZS5XZyh3aW5kb3csSC53bSgpLHtpZDp4Y30pfSw1MDApLGlhPWUuWSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBzYz1jLkVqfHxzYztuZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUWg9dGhpcy5jb25mPXRoaXMuSGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkRkPTA7dGhpcy5lYj0iIjt0aGlzLkpkPVtdO3RoaXMuS2Q9MDt0aGlzLlNoPSExO3RoaXMucmY9W107ZS5yYigibmV3QWRkZWxpdmVyeSIpfWMuSWk9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5RaD1hfSxCZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYTt0aGlzLmViPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxXbjpmdW5jdGlvbihhKXt0aGlzLkhiPWF9LFZuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGN9LFZjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLnhtKCkpdGhpcy5IYi5nKHRoaXMuSGIuTGMsdGhpcy5IYi5xYSx0aGlzLkhiLnRmLGZ1bmN0aW9uKCl7dGhpcy5WYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuSGIuZ2MpO2Vsc2UgaWYodGhpcy5vbSgpKXRoaXMuU24oZnVuY3Rpb24oKXt0aGlzLlZjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5FYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPQpuZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLnZvKCk7bC5leGl0RnVsbHNjcmVlbigpO2UucmIoIm5ld0hvbWFkRGlzcGxheSIpO1E9bD1uZXcgUGEobCx0aGlzLkhiLGgpO2wuVG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLldtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWYmJihkPXRoaXMucGxheWVyLmFmKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLmNmKGEsZCxmKTt0aGlzLnBsYXllci5kaShsKX19LHhtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuRGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktCnRoaXMuRGQuZ2V0VGltZSgpLHRoaXMuRGQ9YSwzRTU8Yz8hMDohMTt0aGlzLkRkPWE7cmV0dXJuITF9LGxvOmZ1bmN0aW9uKCl7ZS5yYigicHJlcm9sbCIpO2UuQWYoInByZXJvbGwiKTt2YXIgYT10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkhhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5TZyhhKSk/dGhpcy5WYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLnFkLHRoaXMucGxheWVyLmwoKSkpfSxrbzpmdW5jdGlvbihhKXtpZighdGhpcy5RaCl7ZS5BZigicG9zdHJvbGwiKTtlLnJiKCJwb3N0cm9sbCIpO3RoaXMuJG4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkhhKCJwb3N0cm9sbEFkVGFnIikpOwooZD10aGlzLlNnKGQpKT90aGlzLlZjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnFkLHRoaXMucGxheWVyLmwoKSkpfX0sU2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LEpuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuaW8odGhpcy5rby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5MYSgpfSxPZDpmdW5jdGlvbihhKXtlLnJiKCJtaWRyb2xsIik7ZS5BZigibWlkcm9sbCIpO2lmKCF0aGlzLkZoKXt0aGlzLkZoPSEwO3ZhciBjPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSGEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlZjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLm8oay5xZCx0aGlzLnBsYXllci5sKCkpKX19LEluOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuWm4odGhpcy5PZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5mZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5sbygpO3RoaXMucGxheWVyLmZmJiZ0aGlzLkluKCk7dGhpcy5KbigpfSxLbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkpkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy50cChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLktkPXRoaXMuSmQubGVuZ3RofSxvbTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5LZCYmKGE9ITApO3JldHVybiBhfSxTbjpmdW5jdGlvbihhKXt0aGlzLlNoPWE7Zm9yKGE9MDthPHRoaXMuSmQubGVuZ3RoO2ErKyl0aGlzLkpkW2FdWyJmdW5jdGlvbiJdKHRoaXMueG4uYmluZCh0aGlzKSl9LHhuOmZ1bmN0aW9uKGEpe3RoaXMuS2QtLTthJiZ0aGlzLnJmLnB1c2goYSk7MD49dGhpcy5LZCYmdGhpcy5TaCgpfSxXbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5yZi5sZW5ndGg7ZCsrKWM9dGhpcy5yZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5JaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLllpfHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGt1aVNoaXNoV3VzaG9kb28sa3VpU2hpc2hXdXNob2Rvbyk7Cg==
- 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 B697
|
241 B
0
|
|
Script
text/javascript |
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.giga.de/fe9705f7e14c5b46b7295aea7caf6fa5e62fbadb/
Frame 7103
|
109 B
671 B
|
93ms
28ms
|
XHR
application/json |
46.4.77.66
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.giga.de/fe9705f7e14c5b46b7295aea7caf6fa5e62fbadb/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGt1aVNoaXNoV3VzaG9kb289a3VpU2hpc2hXdXNob2Rvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cubWZ8fCh3Lm1mPTApO3cubWYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5tZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZighbCl1YyhlYSw1MCk7ZWxzZSBpZighZS5wbil7bC5wYXVzZUJ1dHRvbnx8KGwucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLm11dGVCdXR0b258fChsLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbC5za2lwYWJsZUJ1dHRvbnx8KGwuc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTtsLnNraXBCdXR0b258fChsLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobC5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtsLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxtKX0pfW0uZyhsLmdsb2JhbENvbmZpZyxsLmNsaWVudENvbmZpZyxsLnByZWNoZWNrZWQsbC5vblJlYWR5LGwub25GYWlsdXJlLGwpO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPWwuc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHQoYyxhKXtpZihlLmJsKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkVjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP20uSWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZmE7Yi5CZihjKTtiLlduKG0pO2IuVm4obCk7Yi5LbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKG0ud2IubGVuZ3RoKXt2YXIgYj1tLndiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGc7Zz1lLmNvKHsiW0xPQURTQ1JJUFRdIjplLlkoMTApLCJbVVRJTFNdIjplLlkoMTApLCJbQ0FMTEJBQ0tdIjplLlkoMTApfSk7d2luZG93W2dbIltMT0FEU0NSSVBUXSJdXT1lLkRoLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBnIGluIGIpbFtnXT1iW2ddO3QoYyxhKX07Zz1iLnNjcmlwdHMuc2hpZnQoKTspZS5EaChnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxtKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmNrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5ibD0hMTt0aGlzLkpiPSJzZXR1cCI7dGhpcy5XYz1bXTt0aGlzLnplKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMud24uYmluZCh0aGlzKSk7dGhpcy5xYj17fTt0aGlzLnBoPXt9O3RoaXMueWY9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXt1bzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5xYlthXSsiXyIpO3JldHVybiBifSxqYzpmdW5jdGlvbigpe3RoaXMueWZ8fCh0aGlzLnlmPWUuWSgxMCkpO3JldHVybiB0aGlzLnlmfSxyYjpmdW5jdGlvbihiKXt0aGlzLnFiW2JdfHwodGhpcy5xYltiXT0wKTt0aGlzLnFiW2JdKz0xOzU8dGhpcy5xYltiXSYmIXRoaXMucGhbYl0mJih0aGlzLnBoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMudW8oKSwhMCkpfSx6ZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFRrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGxhOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSx3bjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy52bihiLmRhdGEpfSx2bjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx1ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LExnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmVoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5FZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGVoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFJrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUuTmwoYikpcmV0dXJuOyhhPXRoaXMuTGcoYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE5sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxWZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sSW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sTWU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZGg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LGZvOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sRGY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy54bChhKSxmPTA7ZjxkLmxlbmd0aDtmKyspdGhpcy5mbyhiLGRbZl0ua2V5LGRbZl0udmFsdWUpfSxkbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0seGw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9mPWNbMV0udHJpbSgpOmY9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLmRsKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpmfTthLnB1c2goZCl9cmV0dXJuIGF9LEtmOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHloOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFZlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxmPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2Y9aC5oZWlnaHQ7MD5oLnRvcCYmKGYrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZik7Yz49YSYmKGU9ITApO3JldHVybiBlfSxXZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlZlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldlKGIpfS5iaW5kKHRoaXMpLDEwMCl9LE9iOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxPZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZjtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylmPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2YsYXw9MDtyZXR1cm4gYX0sRWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWI+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBmLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx4PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1iLmNoYXJDb2RlQXQoZik8PDI0fGIuY2hhckNvZGVBdChmKzEpPDwxNnxiLmNoYXJDb2RlQXQoZisyKTw8OHxiLmNoYXJDb2RlQXQoZiszKSxyLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZik7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cltiKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWg7bD14O3k9azt0PW07Zm9yKGY9MDsxOT49ZjtmKyspcT1kKHAsNSkrKG4mbHx+biZ5KSt0K2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7Zm9yKGY9MjA7Mzk+PWY7ZisrKXE9ZChwLDUpKyhuXmxeeSkrdCtjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1sLGw9ZChuLDMwKSxuPXAscD1xO2ZvcihmPTQwOzU5Pj1mO2YrKylxPWQocCw1KSsobiZsfG4meXxsJnkpK3QrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bCxsPWQobiwzMCksbj1wLHA9cTtmb3IoZj02MDs3OT49ZjtmKyspcT1kKHAsNSkrKG5ebF55KSt0K2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3g9eCtsJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeCkrYShrKSthKG0pKS50b0xvd2VyQ2FzZSgpfSxDYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxmLHAsYyxlLGgseD0wO3g8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHgrKyksZj1iLmNoYXJDb2RlQXQoeCsrKSxwPWIuY2hhckNvZGVBdCh4KyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZik/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sRG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx2ZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGg9ITEseD0hMSxrPSExLGw9ITE7dHJ5e2E9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuZGM/ITA6ITF9Y2F0Y2godCl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSx4PSFoJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0oa3x8cCkmJiEhd2luZG93LkNTU31jYXRjaChxKXt9Yi5pc1BoYW50b21KUz1hO2IuaXNDaHJvbWVIZWFkbGVzcz1kO2IuaXNGaXJlZm94SGVhZGxlc3M9ZjtiLmlzT3BlcmE9cDtiLmlzRmlyZWZveD1jO2IuaXNTYWZhcmk9ZTtiLmlzSUU9aDtiLmlzRWRnZT14O2IuaXNDaHJvbWU9aztiLmlzQmxpbms9bDtyZXR1cm4gYn0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj17S2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCnNtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LFVqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxKajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LGprOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sWWs6ZnVuY3Rpb24oKXtyZXR1cm4gYi5LaSgpfHxiLlVpKCl8fGIuc20oKXx8Yi5VaigpfHxiLkJrKCl8fGIuSmooKXx8Yi5qaygpfX07cmV0dXJuIG51bGwhPWIuWWsoKX0sU2w6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGY9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZlsxXSkpcmV0dXJuIGQ9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhhKXx8W10sIklFICIrKGRbMV18fCIiKTtpZigiQ2hyb21lIj09PWZbMV0mJihkPWEubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1kKSlyZXR1cm4gZC5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtpZighYilyZXR1cm4gZlsxXTtmPWZbMl0/W2ZbMV0sZlsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShkPWEubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZi5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBmLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFthW2ZdXT1iW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxnKXthJiYoZC5xdWVyeUtleVthXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZj0wLHA9Yi5sZW5ndGg7ZjxwOysrZilhLmhhc093blByb3BlcnR5KGJbZl0pfHwoZC5wdXNoKGJbZl0pLGFbYltmXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEg6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sZm06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEFsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxmLnB1c2goYltwXSk7cmV0dXJuIGZ9LG1vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZj0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhmPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmYpOihkPWIuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LFpnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEFmOmZ1bmN0aW9uKGIpe3RoaXMuSmI9Yn0sV2c6ZnVuY3Rpb24oYixhLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5KYjt0aGlzLnJlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsCmQpKSxiLmRpc3BhdGNoRXZlbnQoZil9Y2F0Y2gocCl7dGhpcy5wbj0hMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEhjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5XZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHo9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih6PWsuU2EoYixhKSk7ZiYmKHo9ay5TYSh6LGYpKTtwJiYoej1rLlNhKHoscCkpO2MmJih6PWsuU2EoeixjKSk7aCYmKHo9ay5TYSh6LGMpKTtlLkhjKHopfSx5bjpmdW5jdGlvbihiKXt2YXIgYT17fTsKaWYoIWIuY29kZSlyZXR1cm4hMTtpZihiLnNwZWNpYWxfdHJhY2t8fGIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmZtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPQpiLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LG5vOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5qYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMucmUoYil9LHJlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMueW4oYik7aWYoYSlpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uU2MoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjsKYi5kYXRhLmhvbWFkX2F0PWE7bS5KYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGY9bS5TYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5KYShmLGZ1bmN0aW9uKGQpe3ZhciBmPQohMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxXZDpmdW5jdGlvbihiKXtpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGEsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uU2MoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLkphKGIpfX0sZGY6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uamwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGYoKX0uYmluZCh0aGlzKSwKNTAwKX0sS2U6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnBiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxOZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0scGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5BZChiKToiIn0sQWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5OZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHhnOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5YZShiKXx8dGhpcy5JbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LndmJiZ3aW5kb3cuc2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC53ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5WZyhiKSlyZXR1cm4gdGhpcy5WZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQ2IoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPQohMTtkPSExO2Q9dGhpcy5iYihiLGEuQWEsYyxmdW5jdGlvbihiKXtlPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWEuQ2QoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUmsoZSxiKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYixhLGQsZixjLGUsaCx6KXt2YXIgaz1lfHxtO2U9ITA7eiYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWUuZGF0YVt0XT1kW3RdO3JldHVybiBrLkphKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmIoYixhLGQsZixjLGssaCx6KX0uYmluZCh0aGlzKSw1MDApfSxFZDpmdW5jdGlvbihiLGEsZCxmLGMsZSxoKXt2YXIgaz0hMDtoJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIHggaW4gaClkKz0iJiIreCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbeF0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUm06ZnVuY3Rpb24oYixhLGQpe3RoaXMuRWQoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuV2MpZm9yKHZhciBjIGluIHRoaXMuV2MpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5XY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuQ2IoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxEaDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkNiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5iYihiLGYuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlJtKGYuQ2QoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LGNvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLldjPWJ9LHRwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5iYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxaazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LEJtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylpZihhW2ZdPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnBqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZW49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucHA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuRmw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnFnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmlnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5uZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5yZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSms9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLmxnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuV289e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmRuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkdsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5xcD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnZsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEucWQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5FYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EucGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkxrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5mZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Eub2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EucWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLktrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQmk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5obj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkZkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlFmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5JZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2Eub3A9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlRvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuUm89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5mbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLklsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e09lOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZixjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBNYXRoLmFicyhhKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk9hfHwieCIpfSxibTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuT2F8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHlkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy55ZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLnlkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5PZSh0aGlzLmphKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMueWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHdtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHdoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLk9lKHRoaXMuYm0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy55ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnZqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChnW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5nP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy50bXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5LYT17fTt0aGlzLkY9bnVsbDt0aGlzLlRjPTEwMDt0aGlzLlBiPTA7dGhpcy5WYT0xNTA7dGhpcy5WYj0wO3RoaXMuWG4oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlBiPD10aGlzLlZhPyh0aGlzLlBiKyssdGhpcy5WYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlRjKSk6MD50aGlzLlZhJiYodGhpcy5WYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlRjKSl9LFFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGI+dGhpcy5WYT8hMDohMX0sdmY6ZnVuY3Rpb24oKXt0aGlzLlBiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxYbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxOOmZ1bmN0aW9uKGEpe3RoaXMuS2FbYS5qYSgpXT0KYTtMJiZMLkNoJiZMLnRvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBlLk1lKHRoaXMuS2EpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLkthKWlmKGI9PXRoaXMuS2FbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuS2FbYS5qYSgpXT8hMDohMX0sQ206ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuS2EpaWYoYS5pZD09dGhpcy5LYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx0cTpmdW5jdGlvbihhKXt0aGlzLkthW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLlpqfHxxOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuVGM9MTA7dGhpcy5QYj0wO3RoaXMuVmE9NTA7dGhpcy5WPW51bGw7dGhpcy5nYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuSWI9IiI7dGhpcy5OZz0hMTt0aGlzLkooKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGc9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZylhLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxMYTpmdW5jdGlvbigpe30saW86ZnVuY3Rpb24oYSl7dGhpcy5WPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVn0sWm46ZnVuY3Rpb24oYSl7dGhpcy5nZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdmfSxmZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuUGI8PXRoaXMuVmEmJih0aGlzLlBiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5UYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sTWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx2cTpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk5rKCk7dGhpcy5NZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxOazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5ZKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFRlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYX0sWDpmdW5jdGlvbigpe3RoaXMuZ2E9ITB9LFVjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxhZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLkliPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5JYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuSWImJihhPSEwKTtyZXR1cm4gYX0scXE6ZnVuY3Rpb24oKXt0aGlzLk5nfHwodGhpcy5OZz0hMCl9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5KaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmZnPSIxIjt0aGlzLmdnPSIyIjt0aGlzLkdrPSIzIjt0aGlzLmJkPTA7dGhpcy5abT0zMDt0aGlzLlpiPVtdO3RoaXMua2I9W107dGhpcy50Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5zZz10aGlzLndpPSExO3RoaXMuc3RhdHVzPXRoaXMuYmQ7dGhpcy5pZD1lLlkoMTApO3RoaXMuQmYoYSk7dGhpcy5ZbihiKX0sZjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt0aGlzLndpfHwodGhpcy53aT0hMCxlLmRmKCkpfSxKaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEubWMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmphKCldfHwod2luZG93W2IuZmEoKV1bYS5qYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmphKCldLmluaXRpYXRvcj1lLmpjKCkpO3dpbmRvd1tiLmZhKCldW2EuamEoKV1bZS5qYygpXT93aW5kb3dbYi5mYSgpXVthLmphKCldW2UuamMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmphKCldW2UuamMoKV09MX0sem06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSTt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5qYSgpXSYmd2luZG93W2cuZmEoKV1bYS5qYSgpXS5pbml0aWF0b3IhPWUuamMoKSYmKHRoaXMuQ2YoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnZtKCk7CmlmKCF0aGlzLnptKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkNmKCk7cmV0dXJufXRoaXMuQ2YoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxnKTt0aGlzLnBpKCk7dGhpcy5zZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5aYi5wdXNoKGEpLHRoaXMua2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5aYiYmMDx0aGlzLlpiLmxlbmd0aCYmKHRoaXMuWmI9ZS51bmlxdWUodGhpcy5aYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWmIuam9pbigiLCIpKSk7aWYodGhpcy5rYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmtiLmxlbmd0aDtnKyspdGhpcy50Y1t0aGlzLmtiW2ddLnJlYXNvbl09PXRoaXMudGNbYV0mJmIucHVzaCh0aGlzLmtiW2ddLmRldGFpbCksdGhpcy50Y1t0aGlzLmtiW2ddLnJlYXNvbl08CnRoaXMudGNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmtiW2ddLmRldGFpbCksYT10aGlzLmtiW2ddLnJlYXNvbik7dGhpcy50Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihnPWUudW5pcXVlKGIpLGE9YSsiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmZnfSxDZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuZ2d9LGVvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ha30sbWE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkfSxrZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5mZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuZ2d9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmJkfSxCZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxZbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuSml8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5ybnx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuZWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVShhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZWp8fG9hOyhmdW5jdGlvbihjKXtjLmZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmZqfHxwYTsoZnVuY3Rpb24oYyl7Yy5naj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuZ2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkJsfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm1oPXRoaXMuc2I9ITE7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubWg9ITApO3RoaXMuTWg9ITE7dGhpcy5VZygpO3RoaXMuSGUoKTt0aGlzLnVsPSExfSxVZzpmdW5jdGlvbigpe3RoaXMuc2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnNiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk1oPWE7aWYodGhpcy5taCl7dGhpcy5IZSgpO2lmKHRoaXMuc2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxIZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNiKXt2YXIgYT10aGlzLk1oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMuc2I9ITApO3RoaXMuVShiKX19LExhOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuT2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLk9kKGIpfS5iaW5kKHRoaXMpKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmdmJiYoMCx0aGlzLmdmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LEplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Canx8c2E7KGZ1bmN0aW9uKGMpe2MuQWo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG1hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5iZDt0aGlzLmlzUGxheWluZz10aGlzLm5lPSExO3RoaXMucGU9MTt0aGlzLmNkPVtdO3RoaXMuQmI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLm5lPSExO3RoaXMucGU9MTt0aGlzLmNkPVtdO3RoaXMuQmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5wZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkJiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGc9MDtnPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2crKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ddLnRhZyl7dGhpcy5CYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkJiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkJiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuQmI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPApkLmxlbmd0aDtnKyspYS5vbihkW2ddLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZ10mJih0aGlzLm5lPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZ10mJnRoaXMuSmgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5abSYmIXRoaXMuemEoKSYmKHRoaXMuQmI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubWEoKSx0aGlzLmdldFBsYXllcigpLnVsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuSWI7YiYmKGIuSGQoKSxiLnJkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5jZC5pbmRleE9mKGIpJiZ0aGlzLmNkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuaWEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5jZC5sZW5ndGg+PXRoaXMucGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5HZT90aGlzLkdlKys6dGhpcy5HZT0xOnRoaXMuRmU/CnRoaXMuRmUrKzp0aGlzLkZlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLktmKGIudmlkZW9UYWcpP2Iuc2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5uZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuRmU+dGhpcy5HZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlVnKCksYi5IZSgpLGIuc2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Banx8dGE7KGZ1bmN0aW9uKGMpe2MuQ2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5XbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpnLnNifHx0aGlzLk0oZyl8fHRoaXMuQ20oZyl8fCh0aGlzLk4oZyksZz1uZXcgdGEoZyx0aGlzLkYpLGcuSigpLGcuZigpKX19dGhpcy5QKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxXbDpmdW5jdGlvbigpe3ZhciBhPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQ2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLk1tfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy52az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOnRoaXMuWCgpKTp0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuVmQoYSl9LmJpbmQodGhpcykpfSxWZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5WJiZ0aGlzLlYoKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGcpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnZrfHx4YTsoZnVuY3Rpb24oYyl7Yy51az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuTWM9dGhpcy5CYT10aGlzLmpkPSExO3RoaXMuVGg9ZS5PYigxMCk7dGhpcy5SZj0hMDt0aGlzLnpjPXRoaXMudGg9ITE7dGhpcy5jbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSWgoKSx0aGlzLmZsKCksdGhpcy52YigpKX0sY246ZnVuY3Rpb24oYSl7cmV0dXJuIGUuSCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxycTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuamEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlcsIjsiLHR5cGVvZiBhLlcsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVz9hLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlc/dHlwZW9mIGEuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5HYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5HYT9hLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkdhP3R5cGVvZiBhLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5HYT9hLkcuR2EoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLkdhP3R5cGVvZiBhLkcuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5sZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmxlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEubWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5tZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS52ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS52ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcudmU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy52ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApLYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLkpjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sZ2g6ZnVuY3Rpb24oKXtpZighdGhpcy5NYyl7dmFyIGE9dGhpcy5KYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLk1jPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5NYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLk1jfSxBbTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoKXt2YXIgYT10aGlzLkpjKCksYj10aGlzLnltKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuc2g9ITApfXJldHVybiB0aGlzLnNofSx5bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuamQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmpkPSEwKTtyZXR1cm4gdGhpcy5qZH0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuSG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sSG46ZnVuY3Rpb24oKXt0aGlzLnpjPSEwO3ZhciBhPXRoaXMuZ2goKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5IKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5BYz0hMDtlLkgoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuQWM9ITA7aWYoZS5IKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuQWM9ITA7ZS5IKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5BYz0hMDtlLkgoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkFjPSEwO2UuSCgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuS2cmJmEuYWRzJiYodGhpcy5LZz1hLmFkcyk7cmV0dXJuIHRoaXMuS2d9LGZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5tYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5KaCgpfS5iaW5kKHRoaXMpKX0sdGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuSWEmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmdoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRkKCl9LmJpbmQodGhpcyksNTApKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQW0oKSl7dmFyIGI9dGhpcy5KYygpLGc9dGhpcy5LYygpO2ImJmcmJih0aGlzLnpjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudGg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkpjKCksYT10aGlzLktjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnRoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmCmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGdsOmZ1bmN0aW9uKCl7dGhpcy5GY3x8KHRoaXMuRmM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkZjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuRmM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuRmMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5GYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2woKX0uYmluZCh0aGlzKSwxMCl9LAp0YjpmdW5jdGlvbigpe3JldHVybiBlLkRlPyExOnRoaXMudmF9LERhOmZ1bmN0aW9uKCl7aWYodGhpcy5xbSgpKXt0aGlzLnZhPSEwO2lmKGUuSCgiZ2lnYS5kZSIpfHxlLkgoInNwaWVsZXRpcHBzLmRlIil8fGUuSCgia2luby5kZSIpfHxlLkgoImRlc2lyZWQuZGUiKSl0aGlzLlJmPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scW06ZnVuY3Rpb24oKXtpZigwPD1lLlVhKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZS5IKCJnaWdhLmRlIil8fGUuSCgic3BpZWxldGlwcHMuZGUiKXx8ZS5IKCJraW5vLmRlIil8fGUuSCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkVkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuU2woKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLkRlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpPyh0aGlzLncoKSx0aGlzLmlhKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlJmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlJmLGZ1bmN0aW9uKCl7dGhpcy50ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxvbDpmdW5jdGlvbigpe3RoaXMuaHF8fCgxMDx0aGlzLmFwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmFwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuUG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2woKX0uYmluZCh0aGlzKSw1MCkpKX0sUG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuYnApe3RoaXMuYnA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy51a3x8eWE7KGZ1bmN0aW9uKGMpe2Mud2s9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmhpKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspdHJ5e2I9Ynx8dGhpcy5oaShhW2ddKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxoaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLk1lKGIpKXthPWI7Zm9yKHZhciBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGI9bmV3IHhhKGFbZ10pLGIuZ2F8fHRoaXMuTShiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5UYyl9fSl9KShjKTsKdmFyIHphPWMud2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLk5qfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm5mPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5YKCk7cmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8CihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLlgoKX0sc246ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JYixnPXRoaXMuamEoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIubWMmJigwPD1nLmluZGV4T2YoZCl8fGIuSGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLm5mPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sdWE6ZnVuY3Rpb24oKXt0aGlzLm5mKys7aWYoMTA8dGhpcy5uZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LExhOmZ1bmN0aW9uKCl7fSxWZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7CnZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5JZSlpZih0aGlzLktifHwodGhpcy5LYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLktiKyssMTU8dGhpcy5LYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLkllPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy50YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLkspLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx0YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZz0hMDtnfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuSz1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBnfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLkJhKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5KbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkpsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Euc24oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiYKd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBSKGFbYl0pO2cuZ2F8fHRoaXMuTShnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy5Cbnx8RmE7bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLmRoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudW49YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLnVuKXtjYXNlICJiZWZvcmUiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZywKYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVShnKTt0aGlzLndkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy53ZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMud2QpfSxrYTpmdW5jdGlvbigpe3JldHVybiEwfSxubDpmdW5jdGlvbigpe2UueWgodGhpcy53ZCk7ZS5WZSh0aGlzLndkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmwoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sYWY6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBHYT1jLnlqfHxHYTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLApiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIEhhPWMueGp8fEhhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLmRoKGEsImVsZW1lbnRJRCIpO2lmKGUueWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5NKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuVmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuVmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhLEphPW5ldyBJYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBLYT0KYy5Eanx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnNqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sT2s6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy5zanx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCxmLGMpe3RoaXMuRWE9Yjt0aGlzLllnPXRoaXMuRWk9ITE7dGhpcy5LaD1kO3RoaXMuaWk9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuRWE9bmV3IEMoYikpO3ZhciBoPQp0aGlzLmpiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbSYmbS5ZZSh0aGlzLkVhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2YmJjQhPWgucmVhZHlTdGF0ZSYmZihoKX0uYmluZCh0aGlzKX1jLnRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBiKXt2YXIgYT1iLGI9IiIsZDtmb3IoZCBpbiBhKWIrPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLllnJiYoYis9CiImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5qYi51cmxDYWxsZWQ9dGhpcy5FYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5qYi5vcGVuKHRoaXMuRWEubWV0aG9kLHRoaXMuRWEudXJsLCExKTp0aGlzLmpiLm9wZW4odGhpcy5FYS5tZXRob2QsdGhpcy5FYS51cmwsITApLHRoaXMuRWl8fCh0aGlzLmpiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5qYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5qYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5qYi5zZW5kKGIpfWNhdGNoKGYpe2I9dGhpcy5FYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8dGhpcy5FYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpLG0mJm0uWWUodGhpcy5FYS51cmwpJiYKIWI/ZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOm0uWWUodGhpcy5FYS51cmwpLHRoaXMuS2gmJnRoaXMuS2goKX1yZXR1cm4gdGhpcy5qYn19fSkoYyk7dmFyIExhPWMudGp8fExhOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5GYT10aGlzLmllPSExfWMuYWo9YTthLnByb3RvdHlwZT17Ym86ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxhbzpmdW5jdGlvbihiKXt0aGlzLkZhPWJ9LE1uOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3hwOiJBZENsaWNrVGhydSIsenA6IkFkRXJyb3IiLEFwOiJBZFN0b3BwZWQiLERwOiJBZExpbmVhckNoYW5nZSIsRXA6IkFkVGFnUGFyc2VkIixIcDoiQWRWaWRlb0NvbXBsZXRlIixLcDoiQWRMb2FkZWQiLExwOiJBZFNraXBwZWQiLE1wOiJBZFN0YXJ0ZWQiLEJwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsQ3A6IkFkSW1wcmVzc2lvbiIsCnlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLmllLGFbZF0pfSxMbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuRmEmJnRoaXMuRmEuaGUpZm9yKHZhciBhIGluIHRoaXMuRmEuaGUpdGhpcy5GYS5oZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkZhLHRoaXMuRmEuaGVbYV0pO3RoaXMuRmEmJnRoaXMuRmEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuRmEuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmllJiYKdGhpcy5NbigpO3RoaXMuRmEmJnRoaXMuTG4oKX19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5JYT0hMTt0aGlzLmJjPSIiO3RoaXMua2Q9dGhpcy5hYz10aGlzLmxiPW51bGw7dGhpcy5RZz10aGlzLndiPXRoaXMuJGU9ITE7dGhpcy5BYT0iIjt0aGlzLlplPSExO3RoaXMucWE9dGhpcy5MYz0iIjt0aGlzLlVlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnRmPSExO3RoaXMuaGE9W107dGhpcy5RZT10aGlzLlJiPSIiO3RoaXMuZmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5lZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMueWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuWWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuU2I9IiI7dGhpcy5UYj1bXTt0aGlzLlViPVtdO3RoaXMuWGM9W107CnRoaXMucWM9IiI7dGhpcy5EYj0hMTt0aGlzLlVkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubGM9ITE7dGhpcy5GZz10aGlzLiRkPW51bGw7dGhpcy5HZj10aGlzLmhiPXRoaXMuUGc9dGhpcy5ZZD10aGlzLlNmPXRoaXMubWQ9dGhpcy51Yz0hMTt0aGlzLiRhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkJkPTA7dGhpcy5vaD0hMTt0aGlzLm5oPTFFMzt0aGlzLkJjPSExO3RoaXMuUGE9MUUzO3RoaXMuZGQ9dGhpcy5lZD0iIn1jLnVqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLklhLGFkdGFncGFyYW1ldGVyOnRoaXMuYmMsYWR0YWdtb2RpZmllcjp0aGlzLmxiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5hYyxhZHRhZ3JlZ2V4OnRoaXMua2QsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuJGUsc2lkZWxvYWRzOnRoaXMud2IsZGlzYWJsZXRlc3RzOnRoaXMuUWcsaG9tYWRBbGlhczp0aGlzLkFhLAppc0luaXRpYWxpemVkOnRoaXMuWmUsZ2xvYmFsQ29uZmlnOnRoaXMuTGMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLlVlLHNlcnZlcjp0aGlzLmhhLHN2bUNvbmZpZzp0aGlzLlJiLGhvbWFkQWRwYXRoOnRoaXMuUWUsSE9NQURfVkVSSUZJRUQ6dGhpcy5mZSxIT01BRF9CTE9DS0VEOnRoaXMuZWUsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMuWWIsdGVzdEhpZGU6dGhpcy5TYix0ZXN0VGFnczp0aGlzLlRiLHRlc3RUYWdzSlM6dGhpcy5VYix0ZXN0VGFnc1hIUjp0aGlzLlhjLHRlc3QzUENvb2tpZTp0aGlzLnFjLHRocm90dGxlOnRoaXMuVWQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5sYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkZnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMudWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1kLAp1c2VTdHJpY3RDaGVja3M6dGhpcy5TZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5ZZCxjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy55YSxzZXJ2ZXJJZDp0aGlzLnhmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5hYix2cGFpZDp0aGlzLmhiLHNraXBBbGxvd2VkOnRoaXMuR2Ysdm1hcHM6dGhpcy5YZixhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuQmMsYWRGYWxsYmFja1VSTDp0aGlzLmVkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5kZH19LFVuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLklhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLmJjPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMubGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYKKHRoaXMuYWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5rZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLiRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy53Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlFnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5aZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5MYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlVlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaGE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5SYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuUWU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuZmU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5lZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYKKHRoaXMueWI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5ZYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuU2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuVGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5VYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlhjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5xYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuVWQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmxjPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLkZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnVjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMubWQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuU2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5ZZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuJGE9Yi5jb25maWdGYWlsdXJlcyk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy54Zj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmFiPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuaGI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuR2Y9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuWGY9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5CYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuZWQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5hZEZhbGxiYWNrQ29uZmlnJiYodGhpcy5kZD1iLmFkRmFsbGJhY2tDb25maWcpfSxubTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2FdJiYxPT10aGlzLiRhW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LHpmOmZ1bmN0aW9uKGIpe3RoaXMuJGFbYl09ITB9LFhsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYV0mJjE9PXRoaXMuJGFbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sU2Q6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKYj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk9iKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWUuWmsoYil9LHdhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZj0iIixjPSIiLGU9IiIsaD0iIjtpZighdGhpcy5JYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2Y9dGhpcy5YZShiKTtjPXRoaXMuYWEoYik7Zj8odGhpcy5OYygpP2U9YjplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5TYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLmJjfHx0aGlzLmxifHx0aGlzLmFjfHx0aGlzLmtkKSYmKGg9dGhpcy5hbihoKSk7Yj1uZXcgQyhlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKToKdGhpcy5abChjLmhvc3QpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9aDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5DYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LFhlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5OYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaGEmJnRoaXMuaGEubGVuZ3RoJiYwPHRoaXMuaGEubGVuZ3RoJiYoYT10aGlzLmhhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsCiIiKSxhPWEucmVwbGFjZSgiaHR0cDovLyIsIiIpLGE9YS5yZXBsYWNlKCIvLyIsIiIpLGI9KGI9YS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxZZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLlhlKGIpO3JldHVybiBhfSxabDpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LENkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFbdGhpcy54Zl19LFNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DZCgpLGE9dGhpcy5FZigobmV3IERhdGUpLmdldFRpbWUoKSsKIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBiLnJlcGxhY2UoIltoYXNoXSIsYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sR2g6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sJG06ZnVuY3Rpb24oYixhKXt2YXIgZD1lLmFhKGIpLGY9IiIsZj0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxCPTA7QjxoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy5HaChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pOwpoPVtdO2ZvcihsIGluIGYpaC5wdXNoKGwrIj0iK2ZbbF0pO2Y9aD1lbmNvZGVVUklDb21wb25lbnQoaC5qb2luKCImIikpfWVsc2UgZj10aGlzLkdoKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYW46ZnVuY3Rpb24oYil7dGhpcy5iYyYmKGIrPXRoaXMuYmMpO2lmKHRoaXMubGIpZm9yKHZhciBhIGluIHRoaXMubGIpdGhpcy5sYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5sYlthXSkpO3RoaXMuYWMmJihiPXRoaXMuJG0oYix0aGlzLmFjKSk7cmV0dXJuIGJ9LG1sOmZ1bmN0aW9uKCl7dGhpcy55YSYmdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLmhsKHRoaXMueWEuY2xpZW50QVBJcyl9LGhsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmCmEuYm8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmFvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZixjLGUpe209dGhpczt0aGlzLlplPSEwO3RoaXMuTGM9Yjt0aGlzLnFhPWE7dGhpcy50Zj1kO3RoaXMuJGQ9Zjt0aGlzLmdjPWM7dGhpcy55YT1lfHx7fTt0aGlzLm1sKCk7dGhpcy5RbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLk9tKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkRjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuRGMoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sdWI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxRbTpmdW5jdGlvbigpe3RoaXMuSmEobmV3IEModGhpcy5MYyt0aGlzLnRlKCJnbG9iYWwiKSksdGhpcy5sbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy56ZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkRjKCl9LmJpbmQodGhpcyksITApfSxPbTpmdW5jdGlvbigpe3RoaXMuSmEobmV3IEModGhpcy5xYSt0aGlzLnRlKCJjbGllbnQiLC0xIT10aGlzLnFhLmluZGV4T2YoIj8iKSkpLHRoaXMuRGMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuemYoImNsaWVudCIpO3RoaXMuc2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LHRlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ7ZD0oYT8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5PYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYKKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5tZCl7dGhpcy5tZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZyl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTsKZm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5nYz0hMSk7ImZvY3VzLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuZ2M9ITEpO3RoaXMuZ2MmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5nYz90aGlzLmdjKCk6KGEoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYSw1MDApKTt0aGlzLlM9dGhpcy5VZT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy5lZSkpO3RoaXMuV2IoKTtlLkhjKGsucW4pOyhhPWUuVWEodGhpcy5DZCgpKSl8fChhPWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpOwpifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxsbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZj0hMTt0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGY9ITApfWNhdGNoKGgpe31pZighKGZ8fGEuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUmJ8fAp0aGlzLkFhfHx0aGlzLkRjKCk6KHRoaXMuSWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy5XYigpKX19LERjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7dHJ5e3ZhciBjPWUuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihhPSEwKX1jYXRjaChoKXt9Yz1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8ZC5zZXJ2ZXIubGVuZ3RoO2IrKyl7dmFyIGE9ZC5zZXJ2ZXJbYl07dHJ5e3ZhciBnOyhnPXZvaWQgMD09PWEpfHwoZz0hYS5yZXBsYWNlKCJbaGFzaF0iLHRoaXMuRWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSkpO2lmKGcpcmV0dXJuITF9Y2F0Y2goZil7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmhhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5oYS5sZW5ndGg7YisrKXRoaXMuaGFbYl09dGhpcy5oYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuSCgid2ViLmRlIil8fGUuSCgiZ214Lm5ldCIpfHxlLkgoImdteC5hdCIpfHwKZS5IKCJnbXguY2giKXx8ZS5IKCIxdW5kMS5kZSIpKSYmIXRoaXMuTmMoKSlmb3IoYj0wO2I8dGhpcy5oYS5sZW5ndGg7YisrKXRoaXMuaGFbYl09dGhpcy5oYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5kZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5SYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuUWU9ZC5hZHBhdGh8fCIiO3RoaXMueGY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuaGEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5SYiYmdGhpcy5BYSYmdGhpcy5oYS5sZW5ndGg/dGhpcy5PYyghMSk6KHRoaXMuSWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy5XYigpKX0sY2k6ZnVuY3Rpb24oYil7dGhpcy5lZHx8KHRoaXMuZWQ9Ynx8CiIiKX0sT2M6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEModGhpcy5TYygpKSxkPXRoaXMuYWEodGhpcy5SYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQyh0aGlzLlJiK3RoaXMudGUoImN1c3RvbWVyIikpO3RoaXMuSmEoYSx0aGlzLndvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnpmKCJjdXN0b21lciIpO2I/dGhpcy5paz90aGlzLnNhKCJub1NWTUNvbmZpZyIpOih0aGlzLmlrPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5PYyghMCl9LmJpbmQodGhpcyksITApfX0sd286ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9CmIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5sYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubGM9ITA7dGhpcy5PYyghMCk7cmV0dXJufX1hPSExO3RyeXt2YXIgYz1lLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWlmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiYoZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGhpZGUiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFncyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzanMiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc3hociIpKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEIpe310aGlzLlNmPXRoaXMuZ2IoZC5zdHJpY3QpO3RoaXMuWWQ9dGhpcy5nYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7CnRoaXMuUGc9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmFiPXRoaXMuZ2IoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmdiKGQuZW5hYmxlZCk7dGhpcy5TYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlViPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuWGM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnFjPWQudGVzdDNwY29va2llfHwiIjt0aGlzLmJjPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMubGI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuYWM9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmtkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLiRlPWQuanNwb3B1cHN8fCExO3RoaXMud2I9ZC5zaWRlbG9hZHN8fCExO3RoaXMuaGI9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLmhiO3RoaXMuR2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5uZD1kLmNhcHRpb25fZHVyYXRpb258fAohMTt0aGlzLlhmPWQudm1hcHN8fCIiO3RoaXMuQmM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmRkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlVkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMubGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmxjPSEwLHRoaXMuT2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuSm8oKSYmKHRoaXMuU2J8fHRoaXMuVWJ8fHRoaXMuVGJ8fHRoaXMuWGMpP3RoaXMudGY/KHRoaXMuSWE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy55ZSgpLHRoaXMuV2IoKSk6dGhpcy56bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLk9mKCkpfX0sem86ZnVuY3Rpb24oKXt0aGlzLnlvKCk7dGhpcy5BbygpfSxBbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5ZKDEwKSxoPWUuWSgxMCksQj1lLlkoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoQikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQ2IoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS52ZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLkNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLnNhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxPZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuV2IoKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy51Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5JYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIoYikpLHRoaXMuV2IoKSx0aGlzLnllKCkpfSx5bzpmdW5jdGlvbigpe2lmKHRoaXMuU2Ipe3ZhciBiPWUudmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLkZtKCkpdGhpcy5UZCh0aGlzLlliLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuU2IpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5TYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlRkKHRoaXMuWWIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmxpKCl9fWVsc2UgdGhpcy5saSgpfSxNZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuT2IoKSksCnRoaXMuRG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLkxmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLkxmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlRkKHRoaXMuWWIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5UYj10aGlzLlhjKSYmdGhpcy5UYi5sZW5ndGgpe3ZhciBkPXRoaXMuVGIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5MZigpfSxEbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5KYShuZXcgQyhiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5PYigpKSx0aGlzLkVvKGYsMDxkLmxlbmd0aD9iLmJpbmQodGhpcyk6dGhpcy5NZi5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSl9Y2F0Y2goYyl7dGhpcy5NZigpfX1mdW5jdGlvbiBhKCl7dGhpcy5UZCh0aGlzLlliLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlViJiZ0aGlzLlViLmxlbmd0aCl7dmFyIGQ9dGhpcy5VYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLk1mKCl9LEVvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLnFjKXRyeXtlLkVkKHRoaXMucWMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuRGI9IXRoaXMuZ2IoYS5jYyk7dGhpcy5PZigpfS5iaW5kKHRoaXMpLHRoaXMuamkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5qaSgpfWVsc2UgdGhpcy5PZigpfSxqaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuV2IoKTt0aGlzLnllKCl9LEZtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LApXYjpmdW5jdGlvbigpe3ZhciBhPSIwIixnPSIwIjt0cnl7ZS5DYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnVjJiYoZz0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitnLCEwKTt0aGlzLnFjJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuRGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLmZlKSk7dGhpcy4kZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLiRkJiZ0aGlzLiRkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkRifSl9LGxsOmZ1bmN0aW9uKCl7aWYodGhpcy5ZZCYmdGhpcy5ubSgpKXt2YXIgYT10aGlzLlhsKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZyl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPQphLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxKYTpmdW5jdGlvbihhLGcsZCxmLGMsaCl7dGhpcy5CZHx8KHRoaXMuQmQ9MCk7dGhpcy5CZCsrO3RoaXMuQmQ+dGhpcy5uaCYmIXRoaXMub2gmJih0aGlzLm9oPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5uaCwhMCkpO2E9bmV3IExhKGEsZyxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtmJiYoYS5FaT0hMCk7YyYmZS5EbSgpJiYoYS5ZZz0hMCk7aCYmKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0saWw6ZnVuY3Rpb24oKXt0aGlzLlltfHwodGhpcy5ZbT0hMCxlLkNhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LApmdW5jdGlvbihhKXt2YXIgZz1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihmPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGZbMF0mJihmPWZbMF0pLGYpe2Y9ZiYmZi5jaGlsZE5vZGVzJiZmLmNoaWxkTm9kZXNbMF0/Zi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLk5jKCl8fChmPXRoaXMuYWEoZiksZj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGQpe31lLm5ldHdvcmtTdGF0ZT09CmUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9ZS5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGcpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpO2UubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LAp4bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5YZn0samw6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkphKGEsdGhpcy5Wby5iaW5kKHRoaXMpLHRoaXMuVW8uYmluZCh0aGlzKSl9LFZvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8CnRoaXMuSGwoKX0sVW86ZnVuY3Rpb24oKXt9LEhsOmZ1bmN0aW9uKCl7ZS5IYyhrLkdsKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx5ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMud2IubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy53YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5iYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZmEoKV09dGhpcztlLmJiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LEpvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuVWR9LE9iOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLAphfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxZOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBnPSIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxnYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxDYjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sYWE6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbZ1tmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sRWY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsZT1BcnJheSg4MCksaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZik7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1oO249aztxPWw7cj1tO3U9dDtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZxfH5uJnIpK3UrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7Zm9yKGY9MjA7Mzk+PWY7ZisrKXY9ZChjLDUpKyhuXnFecikrdStlW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1xLHE9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTQwOzU5Pj1mO2YrKyl2PWQoYyw1KSsobiZxfG4mcnxxJnIpK3UrZVtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZj02MDs3OT49ZjtmKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihnKGgpK2coaykrZyhsKStnKG0pK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLnVqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkxpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5MaXx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5lYj1hLmMuUigpOnRoaXMuZWI9IiI7YS5jLnZoJiZhLmMudmgoe3BhdXNlOnRoaXMuSGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy4kaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5oZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLlBvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEub2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5oYz10aGlzLmxkPSExO3RoaXMuWGs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9Zzt0aGlzLmliPXt9O3RoaXMudmlkZW89e307dGhpcy5RZD17fTtlLnJiKCJuZXdCaWdBZElkIik7dGhpcy4kaz1lLlkoMTApOwp0aGlzLklmPTA7dGhpcy5oZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmhkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmhkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlVrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUmM9dGhpcy5QZD0hMTt0aGlzLkVoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5zZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMubWM9ITE7dGhpcy53bD1lLlkoMTApO3RoaXMuTmI9ZS5ZKDEwKTt0aGlzLkxiPWUuWSgxMCk7dGhpcy5laT1lLlkoMTApO3RoaXMuY29uZj17fTt0aGlzLmFlPQp0aGlzLlhiPXRoaXMuQ2U9dGhpcy5zZD10aGlzLlJkPXRoaXMueGI9dGhpcy5zYz10aGlzLk5oPXRoaXMuQmU9dGhpcy54ZD10aGlzLktvPXRoaXMuQWI9dGhpcy5NYj0hMTt0aGlzLnhjPVtdO3RoaXMubmM9e307dGhpcy5tbj0yMDA7dGhpcy4kZj10aGlzLlljPXRoaXMuQ2M9dGhpcy5aZj10aGlzLnNmPSExO3RoaXMua2Y9e319Yy5vaj1hO2EucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBnfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5KYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMucG8oKTtlLm8oay5Mayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxjZjpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLkFiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLklmKyssZS5yYigibmV3U21hbGxBZElkIiksdGhpcy5BLmxsKCksYz1tLmdldENvbmZpZygpLGUuRGUmJih0aGlzLkEuVW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5JYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5yaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkVoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLnJpKCksCm5ldyBTKHRoaXMsYSx0aGlzLkVoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmhiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB2Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2Yy5jZihhLGcsZCl9LDUwKX19LG9mOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5hZT10aGlzLlhiPXRoaXMuQmU9dGhpcy54ZD0hMTt0aGlzLmI9YTt0aGlzLmpvKHRoaXMuYik7dGhpcy5qaChhKTt0aGlzLnhjPXRoaXMuJGcoYSk7dGhpcy5wbCgpfSxqaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5RZD10aGlzLmhtKGIpKSx0aGlzLmpoKGIucGFyZW50KSl9LCRnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy4kZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLlJsKGIpKSk7cmV0dXJuIGd9LFJsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5MJiZhLkwuZ2V0QXR0cmlidXRlKXtnPWEuTC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxobTpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuTCl7Zz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuTC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEucGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scmE6ZnVuY3Rpb24oYSl7YS5aYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS51ZCYmYS51ZC5lcnJvciYmYS51ZC5lcnJvci5jb2RlJiYoZz1hLnVkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuJGMuY29kZTpnPT1GLmplLmNvZGU/ZS5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTooZS5kZigpLGc9PUYuZGcuY29kZSYmZS5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk7ZS5vKGsuRmwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnFvKCk7dGhpcy5XYSgiZW1wdHkiKTt0aGlzLkEuRGImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5EYiwhMCk7YnJlYWs7Y2FzZSB2LmJnLmNvZGU6ZS5vKGsuV28sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmUubyhrLnFwLAp0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5rZS5jb2RlOmUubyhrLnJwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTticmVhaztjYXNlIHYuZ2UuY29kZTplLm8oay5lbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIm5vbWVkaWEiKTticmVhaztjYXNlIHYuY2UuY29kZTplLm8oay5Tbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1bW15YWQiKTticmVhaztjYXNlIHYuYWcuY29kZTplLm8oay5Ubyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLldhKCJ1bmtub3duIil9dGhpcy5pYyhhKTt0aGlzLlFhKCl9LGljOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTmEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5OYS5wb3AoKTt0aGlzLmJmKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxqbzpmdW5jdGlvbihhKXt0aGlzLkNlPSExO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5EZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmliLnpJbmRleD1nO2c9dGhpcy5hLkI7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC56ZCYmKGM9ZC56ZCgpKTtjLnZpZGVvU2xvdCYmKGc9Yy52aWRlb1Nsb3QsdGhpcy5zZj0KITApfWNhdGNoKGgpe31nLnNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5VayYmdGhpcy5wbGF5ZXIuSmUoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkplKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk8ubGVuZ3RoO2QrKylnLmNhblBsYXlUeXBlKGEuT1tkXS50eXBlKSYmCnRoaXMuUGsoZyxhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLnNmJiZnLmxvYWQoKTtpZih0aGlzLm1pKGcpKXt0aGlzLmZpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlNrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5zZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuc2woKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXToKYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZyksdGhpcy5obygpKTp0aGlzLmIub3JpZ2luLlJnKHYuZ2UpfSxobzpmdW5jdGlvbigpe3RoaXMuWmY9ITA7dGhpcy54Yj10aGlzLnNjPSExO3RoaXMuYS5jLmthJiZ0aGlzLmEuYy5rYSgpJiYoZS5vKGsuSWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLnhiPSEwKTtlLnplKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm9hJiZlLlRrKHRoaXMuYi5vcmlnaW4ub2EpO3RoaXMuZmkoInNldHVwIix0aGlzLllhKCkpO3ZhciBhPXRoaXMuYS5CO3RoaXMuYS5CPUQucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQixhKTt0aGlzLmEuT2goKTt0aGlzLmEuRmYoKTtmb3IoYT10aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYS5GZigpO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5EZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy54aSgidnBhaWQiKTtpZih0aGlzLnhiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuUWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9dGhpcy5EPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkQuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRCk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLkRmKHRoaXMuRCx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuRC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5rbSgpLGM9dGhpcy5iLnMuT3JpZ2luYWxBZFBhcmFtZXRlcnM7aWYoYiYmYi51cmwmJjA8PWIudXJsLmluZGV4T2YoIndlbGVjdC5qcyIpJiZ0aGlzLkEpe3ZhciBoPXRoaXMuQS5nZXRDb25maWcoKTtoJiZoLmFkRmFsbGJhY2tDb25maWcmJmguYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyYmKGM9SlNPTi5zdHJpbmdpZnkoaC5hZEZhbGxiYWNrQ29uZmlnKSl9dmFyIGs9Cntob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuRCwiY29uZmlnIixrKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsCmspfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUueGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIiwKdGhpcy5BKTt0aGlzLkQuc3JjPWE7ZS51ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlJkJiZ0aGlzLmEuYy51YSgpJiZlLm8oay5FYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5rYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy54Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmNwKGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZXAoKSx0aGlzLmEua2MoITApLCF0aGlzLlhiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSwKdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5YYj17ZWw6dGhpcy5ELGNiOmZ1bmN0aW9uKCl7dGhpcy5hZT0hMDtlLm8oay5CaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5XZSh0aGlzLlhiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEua2MoITApLHRoaXMuaXAoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmtjKCEwKSx0aGlzLm1wKCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtwKCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmxwKCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubnAoKTsiQWRWaWRlb0NvbXBsZXRlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLmpwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLm5iKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UubyhrLkhnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS5CY3x8dGhpcy5ZYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChkKXt3aW5kb3cub3BlbihoLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ocCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT0KYS5kYXRhLm5hbWUmJmUubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlljJiYodGhpcy4kZj0hMSx0aGlzLnBjKCkpLHRoaXMuZ3AoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy54Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUWIoIm11dGVkIiwidXNlciIpLGUubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLnhiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5RYigidW5tdXRlZCIsCiJ1c2VyIiksZS5vKGsuUWYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZS5vKGsucWUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtlLnVlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcykpO2UudWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEudWcoZnVuY3Rpb24oYSl7ZS5sYSh0aGlzLkQsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxmcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMudHJhY2soInBhdXNlIik7ZS5vKGsub2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuc2M9ITB9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7CmEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5zYz0hMX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxlcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLmdpKCk7ZS5vKGsubGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sbXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWGEoInN0YXJ0Iik7ZS5vKGsuZmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sCmtwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMueGQ9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGxwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlhhKCJtaWRwb2ludCIpO2UubyhrLm5nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LG5wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWGEoInRoaXJkUXVhcnRpbGUiKTtlLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqcDpmdW5jdGlvbigpe3RoaXMuVWYoKTt0aGlzLlhhKCJjb21wbGV0ZSIpfSxDaTpmdW5jdGlvbihhKXtpZih0aGlzLkQmJnRoaXMuRC5wYXJlbnROb2RlJiZ0aGlzLkQucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLldhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgZz0KdGhpcy5ELnBhcmVudE5vZGU7dGhpcy5ELnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5EKTtnLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZyk7ZS56ZSgpO3RoaXMuRD0hMTt0aGlzLlFhKGEpfX0sY3A6ZnVuY3Rpb24oYSl7dmFyIGc9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshZyYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZz1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZy5tYXRjaChkKSk7dGhpcy5XYSgidnBhaWRlcnJvciIpO2UubyhrLm9wLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5DaSghMCl9LFBrOmZ1bmN0aW9uKGEsZyl7ZnVuY3Rpb24gZChhLGIpe2lmKGIuSWEmJmIuaXNFbmFibGVkJiYhYi5OYygpKXt2YXIgZD1iLmFhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKYy5zcmM9ZChnLHRoaXMuQSk7Yy5vbmVycm9yPXRoaXMuJG8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsZChnLHRoaXMuQSkpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sU2s6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuemkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5XZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5VZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlZmLmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuemkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5XZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuQWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5VZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLlZmLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGN8fHRoaXMuV2YoYSl9LmJpbmQodGhpcyksdGhpcy5YaykpfSxXZjpmdW5jdGlvbihhKXtpZighdGhpcy5sZCYmdGhpcy5taSh0aGlzLnZpZGVvKSYmIXRoaXMuTWImJiF0aGlzLmhjKXt0aGlzLmxkPSEwO3RyeXtpZighZS5DYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5iLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuTWJ8fCh0aGlzLk1iPSEwLHRoaXMuTGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLllhKCksITApLHRoaXMuQS5QZ3x8dGhpcy5BLnNhKCJ2aWRlby1ub29wIikpO3RoaXMuUWEoKTtyZXR1cm59fWNhdGNoKGcpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLllhKCksITApfXRoaXMuWW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5GZigpO3RoaXMuWG8oKTt0aGlzLnhpKCk7dGhpcy55ZygpO3RoaXMuYS5PaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5KZigpfX0sSmY6ZnVuY3Rpb24oKXt0aGlzLnNkfHx0aGlzLmpnKCl9LGpnOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMudmlkZW8ucGxheSgpO2lmKGcmJmdbImNhdGNoIl0pZ1siY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuc2R8fChhP3RoaXMuUWEoKToodGhpcy5oZighMCksdGhpcy5qZyghMCkpKX0uYmluZCh0aGlzKSk7CmNhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5vYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm9jLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm9jLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy5zZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuSmYoKSl9LmJpbmQodGhpcyk7dGhpcy5MZSgpLmRpKHRoaXMpfSxVZjpmdW5jdGlvbigpe3RoaXMuQS5hYiYmIXRoaXMuTWImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5YYSgiY29tcGxldGUiKSk7dGhpcy50cmFjaygiY29tcGxldGUiKTt0aGlzLkJlPSEwO2UubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5RYSgpfSxNazpmdW5jdGlvbihhKXtmb3IodmFyIGc9W10sZD0hMSxjPTA7YzxhLmxlbmd0aDtjKyspZD1lLmVoKGFbY10pLApnLnB1c2goZCk7YT17aGFzaGVzOmd9O2E9ay5TYShhLHRoaXMudSgpKTtlLm5vKGEpfSxRYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5iZSYmdGhpcy5Nayh0aGlzLmIuYmUpO2lmKCF0aGlzLkNlKWlmKHRoaXMuQ2U9ITAsdGhpcy5hZXx8KGUubyhrLmhuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnpifHx0aGlzLmIudmMpe2UucmIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuSWYrKzt0aGlzLmhjPXRoaXMubGQ9ITE7dHJ5e3RoaXMuTGQodGhpcy52aWRlbyl9Y2F0Y2goZyl7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5pYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChjKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLlBkPSExO3RyeXt0aGlzLmEudmkoKX1jYXRjaChoKXt9dGhpcy5SZD0hMDt0aGlzLmEuUGUoKTsKdGhpcy5tYz0hMTt0aGlzLkxlKCkuWWgoKTt0aGlzLmIuemImJnRoaXMuYi5vcmlnaW4uamYoKTt0aGlzLmIudmMmJihhP3RoaXMuYi5vcmlnaW4uSGgoKTp0aGlzLnJkKCkpfWVsc2UgdGhpcy5yZCgpfSwkbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkxkKHRoaXMudmlkZW8pLHRoaXMuVmYoYSkpfSxWZjpmdW5jdGlvbihhKXt0aGlzLmhjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5pbCgpO3RoaXMuYi5vcmlnaW4uUmcodi5nZSl9LEFpOmZ1bmN0aW9uKCl7aWYodGhpcy5Lbyl0aGlzLlFhKCk7ZWxzZXt0aGlzLm1jPQohMDt0aGlzLmEuYy51YSYmIXRoaXMuUmQmJnRoaXMuYS5jLnVhKCkmJmUubyhrLkVjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLk5vKGEpO2lmKCF0aGlzLlhiKXt2YXIgZz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoZz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuWGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLmFlPSEwO2UubyhrLkJpLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6ZyxwZXJjZW50OmQsCnN0YXJ0VGltZTohMX07ZS5XZSh0aGlzLlhiKX1kPSIiO3RoaXMuYi5IZiYmKGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5laSkpJiYoZD10aGlzLmIuSGYtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuUGR8fCh0aGlzLlBkPSEwLGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLnBnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5iLnpiPyh0aGlzLmhjPXRoaXMubGQ9ITEsdGhpcy5MZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLlBkPSExLHRoaXMuYS52aSgpLHRoaXMuYi5vcmlnaW4uamYoKSk6CnRoaXMuUWEoKX0uYmluZCh0aGlzKSkpKSxnLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuaGQucmVwbGFjZSgiW3RpbWVdIixlLlpnKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMuc2U9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHNpOmZ1bmN0aW9uKCl7dGhpcy5OaHx8KHRoaXMuTmg9ITAsdGhpcy54ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LE5vOmZ1bmN0aW9uKGEpe2UubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YT09dGhpcy50aXx8dGhpcy5NYnx8KDA9PWEmJih0aGlzLkFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLkFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5EYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsCmZ1bmN0aW9uKCl7dGhpcy5zaSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksdGhpcy5NYnx8dGhpcy5naSgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5BLmFiJiZ0aGlzLlhhKCJzdGFydCIpLGUubyhrLmxnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksZS5vKGsucWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYWImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy54ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmlnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PQpNYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5hYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUubyhrLm5nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuYWImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSx0aGlzLnRpPWEpfSxmaTpmdW5jdGlvbihhLGcpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxnLCEwKX0scG86ZnVuY3Rpb24oKXtlLldkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LApnaTpmdW5jdGlvbigpe2UuV2QoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0scW86ZnVuY3Rpb24oKXtlLldkKFsic3RhdHNfaGRfYWRfZW1wdHk6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sV2E6ZnVuY3Rpb24oYSl7ZS5XZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXsodGhpcy5aZnx8dGhpcy5BLmFiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWWEoKSwhMCl9LFFiOmZ1bmN0aW9uKGEsZyl7dGhpcy5BLmFiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsZywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsZyl7aWYoIXRoaXMuTWIpe3RoaXMua2YmJnRoaXMua2YudHJhY2smJnRoaXMua2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLkRlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwKImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5pbSh0aGlzLmIuTmEsYSl9Y2F0Y2goYyl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkNjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuUWQuaW1wcmVzc2lvbnMmJmUuQm0oaC51cmwsdGhpcy5RZC5pbXByZXNzaW9ucyk/dGhpcy5iZihoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuS2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuUWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5iZihoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZyl0cnl7dGhpcy5iLk5hPXRoaXMuemwodGhpcy5iLk5hLGEpfWNhdGNoKEIpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWUuQ2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYz0iIjt0aGlzLlpmJiYoYz0iX3ZwYWlkIik7dGhpcy5ZYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxiZjpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQS53YShhKSxkJiZjLk9rKGQpLGZ8fChmPXRoaXMuT2cpLGV8fChlPXRoaXMuT2cpLHRoaXMuUWsoYSksdGhpcy5BLkphKGMsZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFFrOmZ1bmN0aW9uKGEpe3RoaXMubmNbYV09Im9wZW4ifSxYaDpmdW5jdGlvbihhKXt0aGlzLm5jW2FdPSJjbG9zZWQifSxwbDpmdW5jdGlvbigpe3RoaXMubmM9Cnt9fSxzbzpmdW5jdGlvbigpe3ZhciBhPTAsYztmb3IoYyBpbiB0aGlzLm5jKXRoaXMubmMuaGFzT3duUHJvcGVydHkoYykmJiJvcGVuIj09dGhpcy5uY1tjXSYmYSsrO3JldHVybiBhfSxpbTpmdW5jdGlvbihhLGMpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1jfSl9LHpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LFlvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLmM7YS50ZyYmYS50Zyh0aGlzLnlpLmJpbmQodGhpcykpO3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMueWkuYmluZCh0aGlzKSl9LHlpOmZ1bmN0aW9uKCl7aWYoZS5DYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5wYygpO2Vsc2UgaWYodGhpcy5iLm5iKXt0cnl7dmFyIGE9KG5ldyBEYXRlKS5nZXRUaW1lKCk7CnRoaXMuYi5BZXx8KHRoaXMuYi5BZT0xKTtpZigxMDA+YS10aGlzLmIuQWUpcmV0dXJuO3RoaXMuYi5BZT1hfWNhdGNoKGMpe31lLm8oay5IZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkEuQmN8fHRoaXMuWWMpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmIubmJ9Y2F0Y2goYyl7YT13aW5kb3cub3Blbih0aGlzLmIubmIsYSk7dHJ5e2F8fHdpbmRvdy5vcGVuKHRoaXMuYi5uYiwiX3RvcCIpfWNhdGNoKGcpe3dpbmRvdy5vcGVuKHRoaXMuYi5uYiwiX3RvcCIpfX19LmJpbmQodGhpcyksNTAwKX19LFhvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmhkLnJlcGxhY2UoIlt0aW1lXSIsZS5aZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5BLm5kJiYoYz10aGlzLkEubmQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmIuYmluZCh0aGlzKSwKMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sRmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5uZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sTmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5uZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHhpOmZ1bmN0aW9uKGEpe2lmKCFlLktmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy53bDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYygpO3RoaXMuTmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IiwKZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vaS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5uaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYygpO3RoaXMuTmQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOgooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkxiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkxvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucGMoKTt0aGlzLk5kKCl9LmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLmVpO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuSGYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuQ2EoKXx8Cih0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnBjKCk7dGhpcy5OZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLApkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS51ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLklnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5oZigpKTt0aGlzLkdiKCl9fSxHYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHBjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLiRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxuaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5mZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLm9lLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLnNjPyhlLmxhKHRoaXMuRCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuc2M9ITEpOihlLmxhKHRoaXMuRCwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5zYz0hMCl9LEhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsub2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5mZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlFiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLlFmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUWIoIm11dGVkIiwidXNlciIpLGUubyhrLkZkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxNbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpOwp0aGlzLnhiPyhlLmxhKHRoaXMuRCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMueGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5ELCJjb250cm9sIiwibXV0ZSIpLHRoaXMueGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0saGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5RYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuRmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFBvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlFiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLlFmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxvYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLm9jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm9jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5vYyk7dGhpcy5zZHx8dGhpcy5zZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuSmYoKSl9LHJkOmZ1bmN0aW9uKCl7dGhpcy5LbSgpJiZ0aGlzLkptKCkmJih0aGlzLkEudWN8fCJzcGllZ2VsLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuSmImJnRoaXMuT28oKXx8KHRoaXMuc2Q9ITAsdGhpcy5BYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5BYj0hMSksdGhpcy5KZygpKX0sS206ZnVuY3Rpb24oKXt2YXIgYT1lLnZkKCk7aWYoIXRoaXMuQS5oYnx8ZS5DYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGM9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuQ2EoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsYytkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LEptOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuUmN8fChhPQohMCxjLmFkRmFsbGJhY2tVUkx8fChjLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkNjJiZjLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5SY3x8ZS50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuQ2M/ImFueSI6IiIpKyhjLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5SYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuQ2MmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlJjfSxZbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sT286ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgYz1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoYy5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmMuYXZhaWxhYmxlKXtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgZz1lLnhnKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoZylyZXR1cm4gdGhpcy5jZihnLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy5yZCgpfXZhciBjPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuWWwoKTt0aGlzLkNjPXRoaXMuUmM9dGhpcy5ZYz10aGlzLiRmPSEwO3JldHVybiBjPyhlLmJiKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2MsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LEpnOmZ1bmN0aW9uKGEpe3RoaXMuc28oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpnKCEwKX0uYmluZCh0aGlzKSwKdGhpcy5tbik6KHRoaXMuUmQ9ITAsdGhpcy5hLlBlKCksdGhpcy5hLlJuKCksdGhpcy5tYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkJlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGUubyhrLnZsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5MZSgpLlloKCkpfSxMZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEoIm1pblZpcyIpO2EmJihlLlZlKHRoaXMudmlkZW8sYSk/dGhpcy4kaCgpOnRoaXMuSGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5uYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi56Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy54YyYmMDx0aGlzLnhjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy54YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy4kaysiLSIrdGhpcy5JZjt0aGlzLmImJnRoaXMuYi5maCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuZmgoKSk7cmV0dXJuIGF9LE9nOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5vanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5Hb3x8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubmE9bnVsbDt0aGlzLlc9W107dGhpcy5MPW51bGw7dGhpcy53Yz10aGlzLnljPSExO3RoaXMub2E9IiI7dGhpcy5ZZj0hMTt0aGlzLnFoPSIiO2QmJmQuZW1wdHk/dGhpcy5UbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLnNrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnZkKCksYjtiPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOm0ud2EobS5TZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBkKCkmJihlLkgoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuSCgiZmFuZG9tLmNvbSIpfHxlLkgoImdpZ2EuZGUiKXx8ZS5IKCJraW5vLmRlIil8fGUuSCgic3BpZWxldGlwcHMuZGUiKXx8ZS5IKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGQoKXx8ZygpKXt2YXIgaD1lLkxnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGc9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxsPWZ1bmN0aW9uKCl7cmV0dXJuKGUuSCgiZ2lnYS5kZSIpfHxlLkgoImtpbm8uZGUiKXx8ZS5IKCJzcGllbGV0aXBwcy5kZSIpfHxlLkgoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZygpfHxrKCl8fGwoKXx8ImFwcHNwb3QiPT1jKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLlNkKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLlNkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZS50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bS53YShtLlNkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5KYShiLHRoaXMuU20uYmluZCh0aGlzKSx0aGlzLlBtLmJpbmQodGhpcykpfSxhaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5uYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkpiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5KYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuSmJ8fHRoaXMuSG0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0ueG8oKSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWcubGVuZ3RoJiYoZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytnWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSG06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxTbTpmdW5jdGlvbihhKXt0aGlzLnpuKGEpO3RyeXt0aGlzLm5hPWEucmVzcG9uc2VYTUwsdGhpcy5uYXx8KHRoaXMubmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2LmtlKSl9dGhpcy5XPXRoaXMuYWgoKTt0aGlzLnljPXRoaXMuTmYoKTt0aGlzLndjPXRoaXMua2koKTt0aGlzLnFoPWEudXJsQ2FsbGVkO2lmKHRoaXMuVy5sZW5ndGgpdGhpcy5RYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlJhKHYuJGMse2Vycm9yOnRoaXMuWWY/Ri5qZTpGLmNnfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuVWEodGhpcy5vYSksITApfWNhdGNoKGMpe319fSxUbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5uYXx8Cih0aGlzLm5hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2LmtlKSl9dGhpcy5XPXRoaXMuYWgoKTt0aGlzLnljPXRoaXMuTmYoKTt0aGlzLndjPXRoaXMua2koKTt0aGlzLlcubGVuZ3RoP3RoaXMuUWMoKTp0aGlzLnJhKHRoaXMuUmEodi4kYyx7ZXJyb3I6dGhpcy5ZZj9GLmplOkYuY2d9KSl9LFBtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlJhKHYuYmcse2RlcHRoOmJ9KSl9LFFjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuVy5zaGlmdCgpO3RoaXMuTG0oKT90aGlzLkZvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMua2goKSxnLHtBZFN5c3RlbTp0aGlzLlFsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSk6KGI9MCx0aGlzLlFvKCkmJnRoaXMub2YodGhpcy55bCgpKSl9LGpmOmZ1bmN0aW9uKCl7dGhpcy55Yz8odGhpcy55Yz0xPHRoaXMuVy5sZW5ndGgsCnRoaXMuVy5sZW5ndGgmJnRoaXMuUWMoKSk6dGhpcy5wYXJlbnQuamYoKX0sSGg6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLlFjKCkpOnRoaXMucGFyZW50LkhoKCl9LFFvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ28oKT90aGlzLkJvKCk/ITA6KC0xIT10aGlzLkljKCk/dGhpcy5yYSh0aGlzLlJhKHYuY2UpKTp0aGlzLnJhKHRoaXMuUmEodi5hZykpLCExKToodGhpcy5yYSh0aGlzLlJhKHYuJGMsRi5kZykpLCExKX0sb2Y6ZnVuY3Rpb24oYSl7dGhpcy5vYXx8KHRoaXMub2E9IiIpO2EuYmV8fChhLmJlPVtdKTthLmJlLnB1c2godGhpcy5xaCk7YS5OYT1hLk5hLmNvbmNhdCh0aGlzLmVmKCkpO2EuemI9YS56Yj9hLnpiOnRoaXMueWM7YS52Yz1hLnZjP2EudmM6dGhpcy53YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5vYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuWGc7dGhpcy5wYXJlbnQub2YoYSl9LAp5bDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5kdXJhdGlvbj10aGlzLkljKCk7YS5PPXRoaXMuaGgoKTthLm5iPXRoaXMuVGwoKTthLnpxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUGwoKTthLkhmPXRoaXMuZ20oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlhnO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlhnO2lmKCF0aGlzLkwmJnRoaXMubmEmJnRoaXMubmEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLkw9dGhpcy5uYTt0cnl7aWYodGhpcy5MJiZ0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5MJiYoYS5OYT1hLmVycm9yLmNvZGUhPXYuY2UuY29kZT9hLk5hLmNvbmNhdCh0aGlzLlVsKCkpOmEuTmEuY29uY2F0KHRoaXMuY20oKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5pYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmljJiZ0aGlzLnBhcmVudC5pYyhhKSxiPTAsdGhpcy5RYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGljOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmljKGEpfSxSZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxDbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuaGgoKS5sZW5ndGh9LEJvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5JYygpfSxOZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGtpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5OZigpJiYoYT0hMCk7cmV0dXJuIGF9LHpuOmZ1bmN0aW9uKGEpe3RoaXMub2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5vYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm9hPSJVTktOT1dOIn10cnl7dGhpcy5ZZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMbTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmtoKCkubGVuZ3RofSxraDpmdW5jdGlvbigpe3JldHVybiB0aGlzLktlKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFFsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2UodGhpcy5MLCJBZFN5c3RlbSIpfSxlZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnhoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnBiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMueGgoYS5wYXJlbnROb2RlKTohMX0sY206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sVWw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVmKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFRsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGIodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LGhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUGE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxVcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5wYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5QYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5QYSktTWF0aC5hYnMoZC1iLlBhKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxQbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5BZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sSWM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5wYih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGdtOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUubW8oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sS2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLnBiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxOZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0scGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5BZChhKToiIn0sQWQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5OZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuc2t8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5Wa3x8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5PPVtdO3RoaXMubmI9IiI7dGhpcy5zPXRoaXMudmM9dGhpcy56Yj0hMTt0aGlzLlJlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5TZT0iIn1jLllqPWE7YS5wcm90b3R5cGU9e3NsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTy5sZW5ndGg7YysrKWlmKDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGFtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmUmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5uYSl7dmFyIGE9dGhpcy5vcmlnaW4ubmE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5SZT1hW2RdKX1yZXR1cm4gdGhpcy5SZX0sCmZoOmZ1bmN0aW9uKCl7aWYodGhpcy5TZSlyZXR1cm4gdGhpcy5TZTt2YXIgYT0iIjsoYT10aGlzLmFtKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5TZT1hfSxrbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk8ubGVuZ3RoO2MrKylpZigwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuWWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuc3B8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXtrZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixNYToiWE1MX1BBUlNFX0VSUk9SIn0sYWc6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixNYToiRFVSQVRJT05fRVJST1IifSwkYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTWE6IkVNUFRZX1ZBU1QifSxlZzp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixNYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sYmc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCk1hOiJMT0FEX0VSUk9SIn0sZ2U6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLE1hOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sdXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTWE6Ik1FRElBRklMRV9FUlJPUiJ9LGNlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE1hOiJEVU1NWV9BRCJ9fSxGPXtjZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE1hOiJOT19BRFMifSxkZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTWE6Ik5PX01FRElBRklMRVMifSx2cDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixNYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLnhrfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnVkPWM7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLmRqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5Xa3x8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlpoPWE7dGhpcy52aWRlbz1jO3RoaXMuWmQ9W107dGhpcy5XaD1bXTt0aGlzLmxmPVtdO3RoaXMuWm89ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLndwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuWmgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5aaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5vcT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Obi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Gbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlpkLnB1c2goe3NyYzpkLGZyYW1lOmgsbm46ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMubGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5sZltjXTtkLnR5cGU9PT1hJiZkLmNsKHRoaXMuVmwoYSkpfX0sVmw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7eHE6ITAsd3E6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7bHE6InZpZGVvIixBcToianNDdXN0b20iLEJxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsQ3E6MSxWcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxqbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuWmQubGVuZ3RoO2MrKylpZih0aGlzLlpkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuWmRbY10ubm47cmV0dXJuIiJ9LE5uOmZ1bmN0aW9uKGEsYyl7dGhpcy5XaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5qbShjKSx2ZW5kb3I6Y30pO3RoaXMub28oKX0sRm46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLlpvLm1hcChmdW5jdGlvbihhKXt0aGlzLnZnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMudmcoYSxjKX0sdmc6ZnVuY3Rpb24oYSxjKXt0aGlzLmxmLnB1c2goe3R5cGU6YSwKY2w6Yyx1cTohMX0pfSxvbzpmdW5jdGlvbigpe3RoaXMuV2gubWFwKGZ1bmN0aW9uKGEpe2EuRW18fChhLm5xKHthZFNlc3Npb25JZDplLlkoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnlxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5FbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLm5rfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLm9iPWEuYmgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlkoMTApO3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk9hPXt9O3RoaXMud2c9ITE7dGhpcy5kYz1bXX1jLmJqPWE7YS5wcm90b3R5cGU9e09sOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuT2woYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLnJtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSx2bzpmdW5jdGlvbigpe3RoaXMud2c9ITB9LHZpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5CPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5CLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkIuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5FYyx0aGlzLmMubCgpKX0sUm46ZnVuY3Rpb24oKXt0aGlzLndnfHwodGhpcy5jLnBsYXkoKSxlLm8oay5xZCx0aGlzLmMubCgpKSl9LEZmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLm9iLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5vYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5vYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQi5zdHlsZS53aWR0aD10aGlzLm9iLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PXRoaXMub2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMub2IpO3RoaXMuYy5VYyYmdGhpcy5jLlVjKCk/dGhpcy5jLmJoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0scm06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSxNbDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGtjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuTWwodGhpcy5vYik7aWYoYy54IT10aGlzLk9hLnh8fGMueSE9dGhpcy5PYS55fHxjLnBvc2l0aW9uIT10aGlzLk9hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk9hLndpZHRofHxjLmhlaWdodCE9dGhpcy5PYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5PYS53aWR0aCYmMDx0aGlzLk9hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuUGUoKTtyZXR1cm59dGhpcy5PYT1jO3RoaXMuYy5VYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQi5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmRjLmxlbmd0aDthKyspdGhpcy5kY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLktmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2MuYmluZCh0aGlzKSwxMCl9LHVnOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLmRjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5kYy5wdXNoKGEpfSxQZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkImJnRoaXMuQi5wYXVzZSYmdGhpcy5CLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5ianx8WWEsRD1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5ZKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5raj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMua2p8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuTWQoYSk7dGhpcy5NZygpfSxNZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sTWc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlRhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5UYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLlNqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZGEoKTt0aGlzLiRiPXRoaXMuJGJ8fCExO3RoaXMubWc9dGhpcy5vZz10aGlzLnVoPXRoaXMudmE9dGhpcy5QZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLktsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnVoJiZ0aGlzLkVnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuSWI7YSYmYS5tYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5vZCgpO3RoaXMudWg9ITA7dGhpcy5FZygpfS5iaW5kKHRoaXMpKTt0aGlzLkFnKCl9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3RoaXMub2QoKTtpZighdGhpcy5QZiYmIXRoaXMub2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlBmJiZ0aGlzLm1nJiYhdGhpcy5vZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKX19LG9kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5paCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxpaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0sQWc6ZnVuY3Rpb24oKXtpZih0aGlzLm9kKCkpe3ZhciBhPXRoaXMuaWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5vZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLm1nPWEuU3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMDApfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5qcSgpOiExfSxJYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuSWMoKTotMX0sZG06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LEtsOmZ1bmN0aW9uKGEsYil7dGhpcy4kYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLiRifHwzMDI9PXRoaXMuJGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuJGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmlhKCkpOmEuVGUoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5kbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Sanx8YmI7KGZ1bmN0aW9uKGMpe2MuVGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxHbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5iay5Iay5Gaz93aW5kb3cuT08uYmsuSGsuRmsuUXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5NZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLlRqfHxjYixkYj1uZXcgY2IodCk7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5sbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMubG58fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuZ2E9ITE7dGhpcy5saCgpfSxsaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5VKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LExhOmZ1bmN0aW9uKCl7dGhpcy5SaCgpfSxSaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuViYmKDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLlNpfHxmYjsoZnVuY3Rpb24oYyl7Yy5SaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5pYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmlhKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkJnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuQmcoYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLlJpfHxnYjsoZnVuY3Rpb24oYyl7Yy5UaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFVoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5NZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5MbHx8KHRoaXMuTGw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVWgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYixUPW5ldyBoYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLkRsfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSi5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxVYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubGt8fFU7KGZ1bmN0aW9uKGMpe2Mua2s9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cuZ2QoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3LmdkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuam4oYSl9LmJpbmQodGhpcykpO3cuZ2QoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5nZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubW0oKX0sam46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmtrfHxWOyhmdW5jdGlvbihjKXtjLm1rPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5HZCYmKGE9ZS5BbChhLHRoaXMuR2QpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5NKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkYpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkdkfHwodGhpcy5HZD1bXSksdGhpcy5HZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5NKGQpfHwodGhpcy5OKGQpLGY9bmV3IFYoZCx0aGlzLkYpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZ2Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwKKHRoaXMuYmFbYV09e30pO3RoaXMuYmFbYV1bYl18fCh0aGlzLmJhW2FdW2JdPVtdKTt0aGlzLmJhW2FdW2JdLnB1c2goYyl9LEhvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYmF8fHRoaXMuYmEmJiF0aGlzLmJhW2JdKXRoaXMuUGN8fCh0aGlzLlBjPVtdKSx0aGlzLlBjLnB1c2goYSksdGhpcy5RbigpJiYodGhpcy52ZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxtbTpmdW5jdGlvbigpe2lmKHRoaXMuUGMpZm9yKHZhciBhPTA7YTx0aGlzLlBjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuUGNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5iYVtjXVtkXSYmMDx0aGlzLmJhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYmFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmJhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5IbyhhKX19KX0pKGMpO3ZhciBqYj1jLm1rfHxqYix3PW5ldyBqYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMudGt8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9pPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuT2l8fGxiOyhmdW5jdGlvbihjKXtjLlBpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuQyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLlBpfHxtYjsoZnVuY3Rpb24oYyl7Yy5RaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTShoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRikpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTTpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkthKWlmKGI9PXRoaXMuS2FbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuS2FbYS5qYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLlFpfHxuYixvYj1uZXcgbmIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5janx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5HZz10aGlzLkdjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt0aGlzLnFsfHwoYS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFsPSEwKTt2YXIgYj10aGlzLlRnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5HYz1iKTtpZighdGhpcy5HZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5HZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuemQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuVChhKTt0aGlzLlUoYik7dGhpcy5Fbih0aGlzLmdldFJhd1BsYXllcigpLGEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLmZjPVtdKTt0aGlzLmZjLnB1c2goYSl9LHJsOmZ1bmN0aW9uKCl7aWYodGhpcy5mYyYmdGhpcy5mYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmZjLmxlbmd0aDthKyspdHJ5e3RoaXMuZmNbYV0oKX1jYXRjaChiKXt9fSx6ZDpmdW5jdGlvbigpe2lmKHRoaXMuR2MpcmV0dXJuIHRoaXMuR2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuVGcoYSkpcmV0dXJuIHRoaXMuR2M9YX19LFRnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJgooYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sRW46ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLm11dGUmJnRoaXMuZWEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sdmg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy5Qanx8cWI7KGZ1bmN0aW9uKGMpe2MuT2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkRpJiYodGhpcy5pKCksdGhpcy5EaT0hMCx0aGlzLm1hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS56ZCgpPwp0aGlzLkMoKToodGhpcy5FZXx8KHRoaXMuRWU9MSksdGhpcy5FZSsrLDEwMDx0aGlzLkVlP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy5Panx8cmI7KGZ1bmN0aW9uKGMpe2MuUWo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLk0oYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgc2I9Yy5Ranx8c2IsVz1uZXcgc2IodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVsPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIHRiPWMuRWx8fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnprPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LExhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuemt8fHViOyhmdW5jdGlvbihjKXtjLnlrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEtjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxDbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj1bXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuaWEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy56Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkNuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuS2MoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuQygpO3JldHVybn1pZighdGhpcy56Yyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmZiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmZiW2JdJiYzMDMhPXRoaXMuZmJbYl0mJjQwMyE9dGhpcy5mYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuaWEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMueWt8fHZiOyhmdW5jdGlvbihjKXtjLkFrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5NKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkYpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuQWt8fHdiLHhiPW5ldyB3Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmFsfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlQoYSk7dGhpcy5VKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMucGY9ITF9LExhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnRuKCl9LmJpbmQodGhpcyksNTAwKX0sdG46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5WJiZ0aGlzLlYoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMucGYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMucGYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxybzpmdW5jdGlvbigpe3RoaXMucGY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLmdrfHx6YjsoZnVuY3Rpb24oYyl7Yy5maz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMucmM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5yY3x8KHRoaXMucmM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5yY3x8dGhpcy5yYysrLHRoaXMucmM8PXRoaXMuWG0/KHRoaXMucmMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnJvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgQWI9Yy5ma3x8QWI7KGZ1bmN0aW9uKGMpe2MuaGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBCYj1jLmhrfHxCYixDYj1uZXcgQmIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRGI9Yy53anx8RGI7bmV3IERiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5VKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5WKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuZWt8fEViOyhmdW5jdGlvbihjKXtjLmRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubWEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMudGwoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5FYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuTm0oKTp0aGlzLkRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sdGw6ZnVuY3Rpb24oKXt0aGlzLmtnKCl8fHRoaXMuaSghMCl9LE5tOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYigpOyFhLnBhJiZhLlcmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxEZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5pYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LEViOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGgpZm9yKHZhciBhPWMuYWQuRWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTGg9YVtlXSk7cmV0dXJuIHRoaXMuTGh9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5FYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLmRrfHxGYjsoZnVuY3Rpb24oYyl7Yy5hZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGtsOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBGYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmFkLkViKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5rbChhW2JdKTt0aGlzLlAoKX19KTtjLmFkLkViPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobCYmbC5wbGF5ZXJhcGkmJihhPWwucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5hZHx8R2IsSGI9bmV3IEdiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5aaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuWml8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkxqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVShiKTp0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxpcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApVYzpmdW5jdGlvbigpe3JldHVybiEwfSxUYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Manx8WDsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5xZj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnFmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMucWYmJmMhPXRoaXMucWZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGUuSCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEucHEpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLktqfHxZOyhmdW5jdGlvbihjKXtjLk1qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuZ2E/dGhpcy52ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxKYj1jLk1qfHxKYixLYj1uZXcgSmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Jaj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBMYj1jLklqfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlUoYikpOnRoaXMuWCgpKTp0aGlzLlgoKTp0aGlzLlgoKTp0aGlzLlgoKX0sYmk6ZnVuY3Rpb24oKXt9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGduOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE1iPWMubWp8fE1iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMueGUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5tYSgpfS5iaW5kKHRoaXMpKX0seGU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy54ZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgTmI9Yy5sanx8TmI7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuZ2F8fHRoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5GKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLm5qfHwKT2IsUGI9bmV3IE9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Jbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFiPWMuSW98fFFiO25ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVShiKSk6dGhpcy5YKCkpOnRoaXMuWCgpfSxiaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxnbjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBSYj1jLlZpfHxSYjsoZnVuY3Rpb24oYyl7Yy5XaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLnhlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmlhKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFNiPWMuV2l8fFNiOyhmdW5jdGlvbihjKXtjLlhpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgYz1uZXcgUmIoYVtiXSk7Yy5nYXx8dGhpcy5NKGMpfHwodGhpcy5OKGMpLHdpbmRvdy5icmlkcGxheWVyPWMsKG5ldyBTYihjLHRoaXMuRikpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMuWGl8fFRiLFViPW5ldyBUYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLk5pfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPQpiLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5VKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWCgpfSxYZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sRG46ZnVuY3Rpb24oKXt0aGlzLlpjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWmN8fCh0aGlzLlpjPSEwLHRoaXMuWGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlpjJiYodGhpcy5YZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlpjPSExKSx0aGlzLlhkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHVhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgV2I9Yy5Ea3x8V2I7KGZ1bmN0aW9uKGMpe2MuQ2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sVmg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5lYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmVjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuZWMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLlZoLmJpbmQodGhpcyksMTApfSxlYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuSWs9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuaSgpKToodGhpcy5Ja3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuaSgpKX0saGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuZWMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhnLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmgoKTt0aGlzLmhnKCk7dGhpcy5HbigpfSxHbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmVjKGEpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLkFuP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLkFuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuZWMoYSkpfX0pfSkoYyk7dmFyIFhiPWMuQ2t8fFhiOyhmdW5jdGlvbihjKXtjLkVrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFdiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5nYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGEuRG4oKSxhPW5ldyBYYihhLHRoaXMuRiksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgWWI9Yy5Fa3x8WWIsWmI9bmV3IFliKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMua249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciAkYj1jLmtufHwkYjtuZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5waz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLlBoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLmJuPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5YKCl9ZWxzZSB0aGlzLlgoKX1lbHNlIHRoaXMuWCgpfSxiaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ibn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuVmQoYSl9LmJpbmQodGhpcykpfSxWZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5QaCYmKHRoaXMuUGg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgTj1jLnBrfHxOOyhmdW5jdGlvbihjKXtjLm9rPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5JZSlpZih0aGlzLktifHwKKHRoaXMuS2I9MCksdGhpcy5LYisrLDE1PHRoaXMuS2Ipe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuZW8oKTp0aGlzLmkoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuaSgpOnRoaXMuaSghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkllPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy50YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLkspLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHRiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLks9YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuSz10aGlzLkt8fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5va3x8TzsoZnVuY3Rpb24oYyl7Yy5xaz0KcS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVmE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5nYXx8dGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHwKdGhpcy5NKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKSk7dGhpcy52ZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIGFjPWMucWt8fGFjLGJjPW5ldyBhYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBjYz1jLk1pfHxjYztuZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Haj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLkdqfHxaOyhmdW5jdGlvbihjKXtjLkZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnJoPTA7dGhpcy5LPXRoaXMuS3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuTWM9dGhpcy5CYT10aGlzLmpkPSExO3RoaXMuVGg9ZS5PYigxMCk7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5wYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnZiKCksITA7dGhpcy5yaCsrO2lmKDEwPHRoaXMucmgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuaSghMCk6dGhpcy5pKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy56aC5iaW5kKHRoaXMpLDEwMCksITF9LHZiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmIoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnZhPQohMH0sY2E6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCk/KHRoaXMudygpLHRoaXMuaWEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Ganx8YWE7KGZ1bmN0aW9uKGMpe2MuSGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLAp0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5Ianx8ZGMsZWM9bmV3IGRjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMucmt8fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLApiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlUoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5YKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGdjPWMuaWp8fGdjOyhmdW5jdGlvbihjKXtjLmhqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLkNnKCl9LENnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgaGM9Yy5oanx8CmhjOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBnYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5nYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLk0oYSkpe3RoaXMuTihhKTsobmV3IGhjKGEsdGhpcy5GKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgaWM9Yy5qanx8aWMsamM9bmV3IGljKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMudW18fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5HaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5VKGEpOnRoaXMuWCgpKTp0aGlzLlgoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGxjPWMuR2l8fGxjOyhmdW5jdGlvbihjKXtjLkZpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLndlKCk7dGhpcy56ZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuSz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSx0YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxEYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LHpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChhPWEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmEuYWRzTG9hZGVyKWZvcih2YXIgYj0wO2I8YS5hZHNMb2FkZXIubGVuZ3RoO2IrKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMuaWEoKSk6dGhpcy5pKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy56Zy5iaW5kKHRoaXMpLAo1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLndlLmJpbmQodGhpcyksMTAwKX0sd2U6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1hLmJpbmQodGhpcyksMTApLHRoaXMudygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuaSgpOnRoaXMuaSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy53ZS5iaW5kKHRoaXMpLDEwMCl9fSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWEuYmluZCh0aGlzKSwxRTQpO3RoaXMuQyhhKX19KX0pKGMpO3ZhciBtYz1jLkZpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFNhOmZ1bmN0aW9uKGEpe2E9Cm5ldyBsYyhhKTthLmdhP3RoaXMuUCgpOnRoaXMuTShhKXx8KHRoaXMuTihhKSwobmV3IG1jKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlNhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5TYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBuYz1jLkhpfHxuYyxvYz1uZXcgbmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGM9Yy5DbHx8cGM7bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkFoPXRoaXMuQ2g9dGhpcy5CaD0hMTt0aGlzLklkPVtdO3RoaXMudWY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYz9udWxsOmJjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHc/bnVsbDp3LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBaYj9udWxsOlpiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLEJyaWRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWI/bnVsbDpVYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEphP251bGw6SmEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9jP251bGw6b2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLiRqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuZW0oYSk6W10sYzt0aGlzLkNoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkJoPQohMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sdGhpcy5haShjKX1lbHNlIGZvcihkIGluIHRoaXMudWYpe2lmKHRoaXMuQWgpYnJlYWs7Yz10aGlzLnVmW2RdO3RoaXMuVGYoYykmJih0aGlzLklkLnB1c2goYyksdGhpcy5haShjKSl9fSxUZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHE/ITA6ITF9LGVtOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYztmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkPWFbZV0sZD10aGlzLnVmW2RdLHRoaXMuVGYoZCkmJmMucHVzaChkKTtyZXR1cm4gY30sYWk6ZnVuY3Rpb24oYSl7dGhpcy5UZihhKSYmYS5mKCl9LHRvOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiByJiYhdGhpcy5CaClmb3IodGhpcy5BaD0hMCxhPTA7YTx0aGlzLklkLmxlbmd0aDthKyspdGhpcy5JZFthXS5WYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLklkW2FdLlZiKX19fSkoYyk7dmFyIHFjPQpjLiRqfHxxYyxMPW5ldyBxYztMLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYz1jLlZtfHxyYztuZXcgcmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGE9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1hLmluZGV4T2YoImhvbWFkIil8fC0xIT1hLmluZGV4T2YoImhkLW1haW4iKSlhPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWEuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1hLnN1YnN0cmluZyhhLmluZGV4T2YoIjoiKSsxLGEuaW5kZXhPZigiaXMgbm90IiktCjEpLGUuSGMoay5SbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuSGMoay5mbiksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciB3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHVjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLGw9ITE7SC5mYSgpO0gud2goKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmZhKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC53aCgpLApmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtILmZhKCk7dmFyIHhjPXdjKGZ1bmN0aW9uKCl7ZS5XZyh3aW5kb3csSC53bSgpLHtpZDp4Y30pfSw1MDApLGlhPWUuWSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBzYz1jLkVqfHxzYztuZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUWg9dGhpcy5jb25mPXRoaXMuSGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkRkPTA7dGhpcy5lYj0iIjt0aGlzLkpkPVtdO3RoaXMuS2Q9MDt0aGlzLlNoPSExO3RoaXMucmY9W107ZS5yYigibmV3QWRkZWxpdmVyeSIpfWMuSWk9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7dGhpcy5RaD1hfSxCZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYTt0aGlzLmViPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxXbjpmdW5jdGlvbihhKXt0aGlzLkhiPWF9LFZuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxIYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGN9LFZjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLnhtKCkpdGhpcy5IYi5nKHRoaXMuSGIuTGMsdGhpcy5IYi5xYSx0aGlzLkhiLnRmLGZ1bmN0aW9uKCl7dGhpcy5WYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuSGIuZ2MpO2Vsc2UgaWYodGhpcy5vbSgpKXRoaXMuU24oZnVuY3Rpb24oKXt0aGlzLlZjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5FYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPQpuZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLnZvKCk7bC5leGl0RnVsbHNjcmVlbigpO2UucmIoIm5ld0hvbWFkRGlzcGxheSIpO1E9bD1uZXcgUGEobCx0aGlzLkhiLGgpO2wuVG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLldtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWYmJihkPXRoaXMucGxheWVyLmFmKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLmNmKGEsZCxmKTt0aGlzLnBsYXllci5kaShsKX19LHhtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuRGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktCnRoaXMuRGQuZ2V0VGltZSgpLHRoaXMuRGQ9YSwzRTU8Yz8hMDohMTt0aGlzLkRkPWE7cmV0dXJuITF9LGxvOmZ1bmN0aW9uKCl7ZS5yYigicHJlcm9sbCIpO2UuQWYoInByZXJvbGwiKTt2YXIgYT10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkhhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5TZyhhKSk/dGhpcy5WYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLnFkLHRoaXMucGxheWVyLmwoKSkpfSxrbzpmdW5jdGlvbihhKXtpZighdGhpcy5RaCl7ZS5BZigicG9zdHJvbGwiKTtlLnJiKCJwb3N0cm9sbCIpO3RoaXMuJG4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkhhKCJwb3N0cm9sbEFkVGFnIikpOwooZD10aGlzLlNnKGQpKT90aGlzLlZjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnFkLHRoaXMucGxheWVyLmwoKSkpfX0sU2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LEpuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuaW8odGhpcy5rby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5MYSgpfSxPZDpmdW5jdGlvbihhKXtlLnJiKCJtaWRyb2xsIik7ZS5BZigibWlkcm9sbCIpO2lmKCF0aGlzLkZoKXt0aGlzLkZoPSEwO3ZhciBjPXRoaXMuSGEoImFkVGFnIik7dGhpcy5IYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSGEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlZjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLm8oay5xZCx0aGlzLnBsYXllci5sKCkpKX19LEluOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuWm4odGhpcy5PZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5mZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5sbygpO3RoaXMucGxheWVyLmZmJiZ0aGlzLkluKCk7dGhpcy5KbigpfSxLbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkpkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy50cChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLktkPXRoaXMuSmQubGVuZ3RofSxvbTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5LZCYmKGE9ITApO3JldHVybiBhfSxTbjpmdW5jdGlvbihhKXt0aGlzLlNoPWE7Zm9yKGE9MDthPHRoaXMuSmQubGVuZ3RoO2ErKyl0aGlzLkpkW2FdWyJmdW5jdGlvbiJdKHRoaXMueG4uYmluZCh0aGlzKSl9LHhuOmZ1bmN0aW9uKGEpe3RoaXMuS2QtLTthJiZ0aGlzLnJmLnB1c2goYSk7MD49dGhpcy5LZCYmdGhpcy5TaCgpfSxXbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5yZi5sZW5ndGg7ZCsrKWM9dGhpcy5yZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5JaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLllpfHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGt1aVNoaXNoV3VzaG9kb28sa3VpU2hpc2hXdXNob2Rvbyk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
46.4.77.66
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.66.77.4.46.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
|
GET
H2
|
200
|
4766719661
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
47 B
251 B
|
21ms
20ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
data
lb15.s400.meetrics.net/
|
43 B
308 B
|
24ms
23ms
|
Image
image/gif |
136.243.33.84
HETZNER-AS
|
|
General
- Full URL
- https://lb15.s400.meetrics.net/data?/rbRDFvZAA/k0FQMmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AxwA1zAwwA50Ax4AmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A23Ax5A22AxmAjpFk9BxzA4yA2wA5wAy2A13AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF90A32A23Ax5A22AxmAhwFk9B03A22A3xA52A2xAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4xAw1AzwAw5A4xA0mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A15A4zA15A1mAjpFk9BxzA4yA2wA5wAx5A0wAmzEp6Fl9BzwAw4E2wAwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9zEr5FmhEwjF90A32A15A4zA15A1mAhwFk9B03A21A54Az1A51AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AxwA1zAwwA54A5xALlnFDUkzF2BPNBAAAAAAABYpSAPAAAFAAYpSTbosAPAAAmUA9BABbosAZBAAOA55A55A85B55A58E55A55AFA32Az3A2BErbosAPFCAmUA9BAHbosAPAAAtGA9BAHl5/ASksFGFjAAAAAAAAAAAAEAAAYpSAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4E2wAwBEMAxzA4yA2wA5wAx5A0wAGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA03A21A54Az1A51ADAzrF5BFKA03A21A54Az1A51AKA03A21A54Az1A51AtAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5BFdmUA9BAsEAYJAFAAAbosAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFBfozYA
- 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.33.84
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h381.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb15.s400.meetrics.net/
|
43 B
308 B
|
24ms
23ms
|
Image
image/gif |
136.243.33.84
HETZNER-AS
|
|
General
- Full URL
- https://lb15.s400.meetrics.net/data?/rbRDGvZAA/k0FIQmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AxwA1zAwwA50Ax4AmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A23Ax5A22AxmAjpFk9BxzA4yA2wA5wAy2A13AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF90A32A23Ax5A22AxmAhwFk9B03A22A3xA52A2xAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4xAw1AzwAw5A4xA0mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF90A32A15A4zA15A1mAjpFk9BxzA4yA2wA5wAx5A0wAmzEp6Fl9BzwAw4E2wAwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9zEr5FmhEwjF90A32A15A4zA15A1mAhwFk9B03A21A54Az1A51AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AxwA1zAwwA54A5xAmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9yEljF0hFunFslFmhEwjF9uE1sFsmBhwFk9Bu1FssFmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGyFljF0hFunFslFmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA14AxwA1zAwxAw3Az1ALlnFETkzFARksFAQtjFw8MnYA
- 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.33.84
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h381.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 506D
|
42 B
110 B
|
16ms
15ms
|
Image
image/gif |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstjWKsL0j-WHyTNnPRKNxVWKwY2CsLnzfhQMbJKTwFq9sKVpZQ6LdIWt6r5N4-JqAKINkt-GRp9kWS624HRAsuxidDZWJaXH7bHxxfiwSM&sig=Cg0ArKJSzHuR0N1SeCHOEAE&adk=2257154448&tt=-1&bs=1585%2C1185&mtos=1018,1018,1018,1018,1018&tos=1018,0,0,0,0&p=125,429,215,1157&sbeos=0&mcvt=1018&rs=0&ht=0&tfs=108&tls=1126&mc=1<e=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1581053009588&dlt&rpt=202&isd=0&msd=0&ext&phel=1&phell=1&xdi=0&ps=1618%2C5069&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-4-11-11-0-0-0&tvt=1124&is=728%2C90&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200205
- 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:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame B75E
|
42 B
110 B
|
15ms
14ms
|
Image
image/gif |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstQc7jd_zUoBFiiCLq0MvaenSrkv7Sru03tUJjOnNfTAhnvduhba84HQS9WmfGvJ32tMATgN0oa6v78ScFv5lNwofjoSR3B4lJn41VWw40&sig=Cg0ArKJSzPYcFzwzEJAwEAE&adk=2685098605&tt=-1&bs=1585%2C1185&mtos=0,1034,1034,1034,1034&tos=0,1034,0,0,0&p=125,1318,725,1618&mcvt=1034&rs=0&ht=0&tfs=105&tls=1139&mc=0.89<e=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1581053009763&dlt&rpt=92&isd=0&msd=0&ext&xdi=0&ps=1618%2C5069&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-2-11-11-0-0-0&tvt=1138&is=300%2C600&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200205
- 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:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
4765983595
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
47 B
252 B
|
21ms
20ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
st
imprammp.taboola.com/
Frame 10E2
|
0
0
|
30ms
28ms
|
Document
text/plain |
151.101.14.49
FASTLY
|
|
General
- Full URL
- https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=171FD0ABEF44786889729736007&cicmp=1657475&cijs=1&dast=V7Jw0CFgNsqjyR4NE2pgRsqjyR4NE2pgUAAAAGBvQHHLFbzEiEBYVFI412w9lwOFysVrPhYjFZbaYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAUDJcYAOz-dlNv0DAOAhAAQAYECBBGAAp6kEoCLn4AQAAAAAAAAAgOX___8_BkCP-EwGIENp8MagB-DBB-BBCAAAIGvowEomHmBa-IyowLSIEQAAAEDVZ7vQ0aROqCyqAAAI0q0ArgAAAuA8NL78s3QHJd7CAAAACMYW6GHx-80Ou8bvdhkAAAAAAAAAgNn_2T-akFQRbxoQcdO02i8gAMDaLyAAAJu6AQC8CcAFnQHtJrPNYHUGMdmMdpPZAQAAANz9____64HgcLYcjUaTkWExW44MM9_GtHI5HKPdbLQabUwu74XyzuSbOvFe9Y0Iy-z3HRSU09NjdhlkLJfJoBbImiaX3yA-aBiWk0EwvwlbjFaTyWY5nC0Xk8FwNByN9idwywFO0HA4WOwGi91iMZwsJqPBcrBAgRhMcEKGo81kNdqtdpPlcDIazTaTDVK0ajUbbQbD1Wwy2-1Ww8FwORohRWsWs8lkMRstd5vBcjIaDCfDIcKYa-VyrhYet2SzsqxFg-VsrdzYlmvhzDjYLIcTj3FjWYteH9NrM9stR44pHtTp4tjXHlwUDLDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu--JwthyNRpORYTFbjgwz38a0cjkco91stBptTC5_zbVyOVcLj1uyWVnWosFytlZubMu1cGYcbJbDice4saxFr4_ptZntliPHvrEaLgarzWCw3DdWw8VgtRkMlvsOneG7-pyNyptW4dH5nNnMQyEzHRQug8X7O1qksVtvZlQZxxaL6jc-iRNWod_v9_v9fr_f7_duzAaPwaCIJYLTRToRvYyni1gieVqkE5HDs1suVsuNbeGZrBa75ci425gcluVwNBrNhoOJWKI0XaQTve5lcRgOn7_g4Tw8zH7R03D4_AUP5-Fhdov9Pqfdrfm7dS6j6fNW3U1uzd8t9rs8p7fSaHmL_T6n3S24_C1ml9tlUf-xAVdzxWo5l2x2c9lslQAAAAAAAAAAljBn3gQAAADgNJDFYjBZLBcAQox1l-BTKuTRCfytuPFjiDld_i6X5a15W9w6p89h5s0A!&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.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 991B
|
42 B
110 B
|
33ms
33ms
|
Image
image/gif |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstn7u2Mwszl1Er8gbAzhCyjY-H1BAoGJnIAAZmQ0HgWP0pyICUy9pHjMWNBxsJfHPDJT10jX1yNSuY-4T0btOuBC6GjMzGD_T1lTUS4wcimL361T_VjDlvMXuqdxA&sai=AMfl-YSrsy96Vgu77W4PKMS_oZmWvUR-DT-W76HV0TE92U3zvBTZS_9g6COgoEm6EDzhje08WOBcV7YbEHItQfDzTFsx7mp-YUGFBKJnVNuy1nTL7CSBWVsL8vedCq8&sig=Cg0ArKJSzFwBO3u6pLWzEAE&cid=CAASF-RoPyANBgv57oX0lHbnJH6D5utLleqt&id=ampim&o=968,282&d=300,250&ss=1600,1200&bs=1600,1200&mcvt=1000&mtos=0,0,1000,1000,1000&tos=0,0,1000,0,0&tfs=858&tls=1858&g=100&h=100&tt=1858&r=v&adk=1428895410&avms=ampa
- 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:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
Show response
track.adform.net/Serving/Cookie/
|
73 B
494 B
|
26ms
26ms
|
Script
text/javascript |
37.157.6.245
ADFORM
|
|
General
- Full URL
- https://track.adform.net/Serving/Cookie/?adfaction=getjs;adfcookname=uid
- Requested by
- Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.45d873e21c33035ceb097390818621c6.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
37.157.6.245
, Denmark,
ASN198622
(ADFORM, DK),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains |
|
GET
H2
|
200
|
f9b17833-d68c-4e4d-b319-d6061d45aa9f
Show response
boot.pubstack.io/v1/tag/
|
1 KB
825 B
|
98ms
33ms
|
Script
application/javascript |
52.30.80.108
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
gocp.stroeermediabrands.de/absconf/www.giga.de/
|
21 KB
21 KB
|
102ms
29ms
|
Fetch
application/json |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
|
7 KB
6 KB
|
33ms
21ms
|
XHR
application/json |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gda&tv=r20200205&st=env
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200205/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 5265b8d575574a11b3af43cfe914c60e98253b5cd85f0b8135179f3d01b2417b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
cmTagFEED_MANAGER.js
Show response
vidstat.taboola.com/vpaid/units/27_3_11/infra/
|
690 KB
153 KB
|
19ms
18ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
cmOsUnit.css
vidstat.taboola.com/vpaid/units/27_3_11/assets/css/
|
35 KB
7 KB
|
45ms
45ms
|
Stylesheet
text/css |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
/
cx.atdmt.com/
Redirect Chain
-
https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
-
https://cx.atdmt.com/?c=259032193151035256&f=AYz-AMqMPgI0k4uqr50d08WoS2JBz9opHugiY8i-IbpbmkMizDxXxspTg-xLgwUYdpN59w4PAVaU-ZRfg3GVjUHp&id=1773162896260346&l=3&v=0
|
42 B
354 B
|
39ms
39ms
|
Image
image/gif |
2a03:2880:f02d:5:face:b00c:0:8c
FACEBOOK
|
|
|
GET
H/1.1
|
200
OK
|
t.png
gocp.stroeermediabrands.de/
|
98 B
355 B
|
24ms
24ms
|
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&_=1581053012627.143461122
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.16.106
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.106.16.40.188.clients.your-server.de
- Software
-
/
- Resource Hash
- ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
68ms
23ms
|
Script
text/javascript |
2.18.234.72
AKAMAI-AS
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/285/5184/s/
|
39 KB
14 KB
|
56ms
17ms
|
Script
application/javascript |
89.163.159.108
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
1 KB
1 KB
|
181ms
44ms
|
Script
application/javascript |
62.168.44.119
GTSCE GTS Central...
|
|
|
GET
H2
|
200
|
default.js
Show response
ups.xplosion.de/loader/69511/
|
2 KB
2 KB
|
343ms
30ms
|
Script
text/javascript |
54.76.119.33
AMAZON-02
|
|
|
GET
H2
|
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
632 B
|
1340ms
28ms
|
Image
image/gif |
35.186.238.175
GOOGLE
|
|
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
|
21 KB
8 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200205/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 9d6757384f86ea93a46cf05a185da797dd19a39053a0cc6e64759598f2bc05c0
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
runner.html
tpc.googlesyndication.com/sodar/sodar2/206/
Frame 662B
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:820::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2/206/runner.html
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
content14_10_18m.js
Show response
vidstat.taboola.com/
|
37 KB
8 KB
|
19ms
18ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
oppsula.js
Show response
vidstat.taboola.com/oppsula/1.3.7/
|
15 KB
5 KB
|
18ms
18ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
OvaMediaPlayer.js
Show response
vidstat.taboola.com/vpaid/vPlayer/player/v57152.804/
|
535 KB
136 KB
|
19ms
19ms
|
Script
application/javascript |
151.101.114.2
FASTLY
|
|
|
GET
H2
|
200
|
sync
match.taboola.com/
Frame C688
|
0
0
|
30ms
29ms
|
Document
text/html |
151.101.14.49
FASTLY
|
|
General
- Full URL
- https://match.taboola.com/sync?dast=V7biQCFgNsqjyR4NE2pgRsqjyR4NE2pgUAAAAGBvQHG7FbzEiEBYVFI412w9lwuNxNlrvNbDDYDYEjdosZibCgsGik0W44Gw6Hi9VqNlwsJqvNFEKM5TIZ1AIJy-z3HRSU09NjdhlkLJfJoBbImiaX3w1faDodPte9Xvf73XVOn8Mucvl1L4vDcPj8BQ_n4WH2i56Gw-cveDgPD7Nb7Pc57W7N361zGU2ft-pucmv-brHf5Tm9lUbLW-z3Oe1uweVvMbvcLr8cAAAAAB4AlAr7IX4AAQAiAAAAACQAAAAAKAIq_i0ELgAAAAAwAAqwfjQAKDkO0OH5vMymfwAAPASAAAAMKJAADOA0lQBU5BycAAAAAAAAAACw_P___8cA6BGfyQBkKA32ADz4ADwQFZgWMQIAAACo-mwXOprUCZVFFQAAQboVwBUAQACch8aXfxgAAADB2AI9LH6_2WHX-N0uAwAAAAAAAAAw-z_7RxOSKuJNAyJumlb7BQQAWPsFBABgUzcAgDcBuKAzoN1kthmsziAmm9FuMjsAAACAu____389EBzOlqPRaDIyLGbLkWHm25hWLodjtJuNVqONyeW9UN6ZfFMn3qu-EWGZ_b6DgnJ6eswug4zlMhnUAlnT5PIbxAcNw3IyCOY3YYvRajLZLIez5WIyGI6Go9H-BG45wAkaDgeL3WCxWyyGk8VkNFgOFigQgwlOyHC0maxGu9VushxORqPZZrJBilatZqPNYLiaTWa73Wo4GC5HI6RozWI2mSxmo-VuM1hORoPhZDhEGHOtXM7VwuOWbFaWtWiwnK2VG9tyLZwZB5vlcOIxbixr0etjem1mu-XIMcWDOl0c-9qDi4IBVnsRXKQTzenyd7ksb83b4tY5fQ6LWKI5WaQT2WVfHM6Wo9FoMjIsZsuRYebbmFYuh2O0m41Wo43J5a-5Vi7nauFxSzYry1o0WM7Wyo1tuRbOjIPNcjjxGDeWtej1Mb02s91y5Ng3VsPFYLUZDJb7xmq4GKw2g8Fy36EzfFefs1F50yo8Op8zm3koZKaDwmWweH9HizR2682MKuPYYlH9xidxwir0-_1-v9_v9_v93o3Z4DEYFLFEcLpIJ6KX8XQRSyRPi3Qicnh2y8VqubEtPJPVYrccGXcbk8OyHI5Go9lwMBFLlKaLdKLXvSwOw-HzFzych4fZL3oaDp-_4OE8PMxusd_ntLs1f7fOZTR93qq7ya35u8V-l-f0Vhotb7Hf57S7BZe_xexyuyzqPzbgaq5YLeeSzW4um60SAAAAAAAAAMAS5sybAAAAAJwGslgMJovlAkCIse4SfEqFPDqBvxU3fgwxp8vf5bK8NW-LW-f0Ocwc!&excid=22&docw=0&cijs=1
- Requested by
- Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/27_3_11/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, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
53 B
|
60ms
58ms
|
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=V7biQCFgNsqjyR4NE2pgRsqjyR4NE2pgUAAAAGBvQHG7FbzEiEBYVFI412w9lwuNxNlrvNbDDYDYEjdosZibCgsGik0W44Gw6Hi9VqNlwsJqvNFEKM5TIZ1AIJy-z3HRSU09NjdhlkLJfJoBbImiaX3w1faDodPte9Xvf73XVOn8Mucvl1L4vDcPj8BQ_n4WH2i56Gw-cveDgPD7Nb7Pc57W7N361zGU2ft-pucmv-brHf5Tm9lUbLW-z3Oe1uweVvMbvcLr8cAAAAAB4AlAr7IX4AAQAiAAAAACQAAAAAKAIq_i0ELgAAAAAwAAqwfjQAKDkO0OH5vMymfwAAPASAAAAMKJAADOA0lQBU5BycAAAAAAAAAACw_P___8cA6BGfyQBkKA32ADz4ADwQFZgWMQIAAACo-mwXOprUCZVFFQAAQboVwBUAQACch8aXfxgAAADB2AI9LH6_2WHX-N0uAwAAAAAAAAAw-z_7RxOSKuJNAyJumlb7BQQAWPsFBABgUzcAgDcBuKAzoN1kthmsziAmm9FuMjsAAACAu____389EBzOlqPRaDIyLGbLkWHm25hWLodjtJuNVqONyeW9UN6ZfFMn3qu-EWGZ_b6DgnJ6eswug4zlMhnUAlnT5PIbxAcNw3IyCOY3YYvRajLZLIez5WIyGI6Go9H-BG45wAkaDgeL3WCxWyyGk8VkNFgOFigQgwlOyHC0maxGu9VushxORqPZZrJBilatZqPNYLiaTWa73Wo4GC5HI6RozWI2mSxmo-VuM1hORoPhZDhEGHOtXM7VwuOWbFaWtWiwnK2VG9tyLZwZB5vlcOIxbixr0etjem1mu-XIMcWDOl0c-9qDi4IBVnsRXKQTzenyd7ksb83b4tY5fQ6LWKI5WaQT2WVfHM6Wo9FoMjIsZsuRYebbmFYuh2O0m41Wo43J5a-5Vi7nauFxSzYry1o0WM7Wyo1tuRbOjIPNcjjxGDeWtej1Mb02s91y5Ng3VsPFYLUZDJb7xmq4GKw2g8Fy36EzfFefs1F50yo8Op8zm3koZKaDwmWweH9HizR2682MKuPYYlH9xidxwir0-_1-v9_v9_v93o3Z4DEYFLFEcLpIJ6KX8XQRSyRPi3Qicnh2y8VqubEtPJPVYrccGXcbk8OyHI5Go9lwMBFLlKaLdKLXvSwOw-HzFzych4fZL3oaDp-_4OE8PMxusd_ntLs1f7fOZTR93qq7ya35u8V-l-f0Vhotb7Hf57S7BZe_xexyuyzqPzbgaq5YLeeSzW4um60SAAAAAAAAAMAS5sybAAAAAJwGslgMJovlAkCIse4SfEqFPDqBvxU3fgwxp8vf5bK8NW-LW-f0Ocwc!&cmcv=&pix=31589837&cb=1581053012748&uv=27311&tms=1581053012748&abt=afsc_vH!expl_vA!pidc3_vB!t45!u27311_vA!ufm_vA!utb11_vA&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1581053008388.551!ts:1581053012748&
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
BLOB
|
206
Partial Content
|
0ca828e3-4f64-47ae-8ea6-54bdd1b51773
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
BLOB
|
206
Partial Content
|
7fcde372-e5ca-4d36-9d48-a0ccb0f2d2c4
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
H2
|
200
|
monitoring.js
Show response
acdn.prod.pubstack.io/
|
61 KB
19 KB
|
48ms
16ms
|
XHR
application/javascript |
2620:1ec:bdf::10
MICROSOFT-CORP-MS...
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
map
ih.adscale.de/
Frame B1FB
|
0
0
|
24ms
23ms
|
Document
text/html |
2.18.234.72
AKAMAI-AS
|
|
|
GET
H2
|
200
|
segments
Show response
api.theadex.com/v0.9/pub/
|
56 B
126 B
|
53ms
16ms
|
Script
text/plain |
89.163.159.124
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.124
Cloppenburg, Germany,
ASN24961
(MYLOC-AS, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
|
0
60 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=206&t=2&li=gda_r20200205&jk=1682944123006514&bg=!kZKlkopYg0JpypWNXOMCAAAARFIAAAANmQFXDv46RcWkobstdps4xVW9I54_hD0gD1WyBRk2u64Oh0327V0oJPQTcNrCUJce2RuVm2chqy7kKuNKlYjmxUyrUK9p88ZXjWDEEFdrsCJSkZ85YSlIdr-vE1rBwQuugn3aEB2R9aWzIYoD4-H3ofcY35XDBBg7f2F7UKqradRv7XPQWFghutx6LVc0ziCAqWGK6qjhZGBP8E4eK9a4PcsgkWNNOVSEF1NQyFKhAhgpIwj3nF2hXvGHH0g56zEGhpsVklnYXwHli2CAi1GT5jEudIvqKEllOgaL-JOzzamv6B7ajUnXuDsvyCI7GtaydRG1aIuROdz2vrltPufdS_TuhNZaqwbbxK8FG09zLS96aOidBF6qvNh44mlB2eoyqlLLsm6IwP-q-CtW9aTCSAdxhXY3bOIRiPmpji4hjP30yFZLy5fBJkFMeq8Rx6arfyRMRY8XURC8iA
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.2.18/
|
5 KB
2 KB
|
25ms
8ms
|
Script
application/javascript |
2600:9000:2057:8a00:1c:8c89:a300:93a1
AMAZON-02
|
|
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
31ms
31ms
|
Script
text/javascript |
54.76.119.33
AMAZON-02
|
|
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_6)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F79.0.3945.88%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=5c30460156a1e9b0cfb47ecc671f68ff&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=106050547579
- 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.76.119.33
Dublin, Ireland,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- ec2-54-76-119-33.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- e9b6f0fb87167a2621ba3ea8f27c77e62c1e9a2df03d1c865f99490df08bade0
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
849 B
|
3152ms
39ms
|
Script
application/javascript |
54.229.119.201
AMAZON-02
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
Frame 7F10
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa3BSf0Bsf-Bsf8BDUkWsfABifABSfABSfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://uss.xplosion.de/usersync?sid=65966&fpid=4217391716396430995
|
42 B
661 B
|
31ms
29ms
|
Image
image/gif |
54.76.119.33
AMAZON-02
|
|
|
OPTIONS
H2
|
204
|
error
Show response
intake.prod.pubstack.io/v1/intake/
|
0
178 B
|
252ms
91ms
|
XHR
text/plain |
108.128.27.24
AMAZON-02
|
|
|
OPTIONS
H2
|
204
|
auction
Show response
intake.prod.pubstack.io/v1/intake/
|
0
178 B
|
251ms
91ms
|
XHR
text/plain |
108.128.27.24
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame 75C5
|
0
0
|
201ms
90ms
|
Document
text/html |
151.101.113.108
FASTLY
|
|
General
- Full URL
- https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.113.108
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame 6D51
|
0
0
|
218ms
19ms
|
Document
text/html |
151.101.113.108
FASTLY
|
|
General
- Full URL
- https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.113.108
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
usync.html
eus.rubiconproject.com/
Frame 53EA
|
0
0
|
316ms
21ms
|
Document
text/html |
23.37.55.184
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
showad.js
ads.pubmatic.com/AdServer/js/
Frame 1C9B
|
0
0
|
326ms
32ms
|
Document
text/html |
2.18.233.180
AKAMAI-AS
|
|
|
GET
H2
|
200
|
index.html
cdn.districtm.io/ids/
Frame 5E99
|
0
0
|
3195ms
119ms
|
Document
text/html |
104.16.68.69
CLOUDFLARENET
|
|
General
- Full URL
- https://cdn.districtm.io/ids/index.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
104.16.68.69
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
|
GET
H2
|
200
|
pd
u.openx.net/w/1.0/
Frame 4D45
Redirect Chain
-
https://u.openx.net/w/1.0/pd
-
https://u.openx.net/w/1.0/pd?cc=1
|
0
0
|
38ms
36ms
|
Document
text/html |
34.95.120.147
GOOGLE
|
|
|
POST
H2
|
204
|
auction
Show response
intake.prod.pubstack.io/v1/intake/
|
0
57 B
|
30ms
30ms
|
XHR
text/plain |
108.128.27.24
AMAZON-02
|
|
|
POST
H2
|
204
|
error
Show response
intake.prod.pubstack.io/v1/intake/
|
0
57 B
|
30ms
30ms
|
XHR
text/plain |
108.128.27.24
AMAZON-02
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
|
42 B
661 B
|
31ms
30ms
|
Image
image/gif |
54.76.119.33
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
data
lb15.s400.meetrics.net/
|
43 B
308 B
|
25ms
24ms
|
Image
image/gif |
136.243.33.84
HETZNER-AS
|
|
General
- Full URL
- https://lb15.s400.meetrics.net/data?/rbRDHaOBALl1FDLkqFKtkyB23A52AwwA6wEylF0pFtlF2qoFx1A4xAw1AzwAw4Az4A41A4uEpqFtpF3rFwBFUkzF2BPGLAAAAAAABPwpAPBAAFAAPwpTTfPAPAAAJPAaEABTfPAZAAAOA55A55A85B55A58E55A55AGAx3AxwAyzArTfPAPfDAJPAaEAHTfPAP7ZAAZAwSAcAAAASksF9EjAAAAAAAAAAAAEAAAPwpAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEEAu1FssFKAHvFvnFslFgBEkYFAAAAIAzzA3wA5zA31AEAu1FssFJAylFj0FhuFnsFlBFEAu1FssFEAu1FssFzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAaEAsEA6DAFAAATfPAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjF1ZY5SA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.84
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h381.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame 0F56
|
0
0
|
121ms
30ms
|
Document
text/html |
52.209.100.206
AMAZON-02
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
25ms
25ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
|
POST
H2
|
204
|
perf
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
421 B
|
30ms
30ms
|
XHR
image/gif |
151.101.14.2
FASTLY
|
|
|