URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Submission Tags: phishing malicious Search All
Submission: On October 07 via api from US

Summary

This website contacted 80 IPs in 9 countries across 65 domains to perform 257 HTTP transactions. The main IP is 178.19.72.10, located in Germany and belongs to HGCOMP-ASN, DE. The main domain is www.giga.de.
TLS certificate: Issued by RapidSSL RSA CA 2018 on July 18th 2018. Valid for: 2 years.
This is the only time www.giga.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
15 178.19.72.10 29551 (HGCOMP-ASN)
1 151.101.14.217 54113 (FASTLY)
1 91.215.100.39 43407 (INFONLINE-AS)
1 46.253.113.178 29551 (HGCOMP-ASN)
9 178.19.70.100 29551 (HGCOMP-ASN)
4 2a00:1450:400... 15169 (GOOGLE)
3 188.40.16.106 24940 (HETZNER-AS)
1 2 161.156.66.178 36351 (SOFTLAYER)
2 2a03:2880:f12... 32934 (FACEBOOK)
14 2a00:1450:400... 15169 (GOOGLE)
4 54.192.201.129 16509 (AMAZON-02)
6 107.178.241.34 15169 (GOOGLE)
1 193.46.63.75 43407 (INFONLINE-AS)
2 3 91.215.100.40 43407 (INFONLINE-AS)
6 109.71.25.30 29551 (HGCOMP-ASN)
10 2a00:1450:400... 15169 (GOOGLE)
3 2a00:1450:400... 15169 (GOOGLE)
3 178.19.72.20 29551 (HGCOMP-ASN)
2 6 104.109.82.87 20940 (AKAMAI-ASN1)
1 13 172.217.16.162 15169 (GOOGLE)
1 13.225.78.101 16509 (AMAZON-02)
1 2.18.233.67 16625 (AKAMAI-AS)
1 1 2600:9000:21f... 16509 (AMAZON-02)
1 2600:9000:21f... 16509 (AMAZON-02)
1 35.156.29.62 16509 (AMAZON-02)
1 2600:9000:204... 16509 (AMAZON-02)
3 2606:4700:20:... 13335 (CLOUDFLAR...)
1 2a00:1450:400... 15169 (GOOGLE)
1 178.19.65.130 29551 (HGCOMP-ASN)
1 2a00:1450:400... 15169 (GOOGLE)
5 26 151.101.114.2 54113 (FASTLY)
1 2a00:1450:400... 15169 (GOOGLE)
1 5 104.111.214.103 16625 (AKAMAI-AS)
3 2a00:1450:400... 15169 (GOOGLE)
1 2 52.94.220.16 16509 (AMAZON-02)
5 136.243.4.7 24940 (HETZNER-AS)
1 2001:4de0:ac1... 20446 (HIGHWINDS3)
6 2.18.234.72 16625 (AKAMAI-AS)
2 4 37.252.173.22 29990 (ASN-APPNEXUS)
1 185.64.189.112 62713 (AS-PUBMATIC)
1 4 37.157.6.246 198622 (ADFORM)
1 2.18.234.21 16625 (AKAMAI-AS)
2 104.16.68.69 13335 (CLOUDFLAR...)
6 9 152.199.22.2 15133 (EDGECAST)
4 4 152.199.22.24 15133 (EDGECAST)
2 34.95.120.147 15169 (GOOGLE)
3 35.206.134.202 19527 (GOOGLE-2)
3 185.86.138.16 201081 (SMARTADSE...)
3 69.173.144.142 26667 (RUBICONPR...)
2 151.101.13.194 54113 (FASTLY)
2 52.219.74.191 16509 (AMAZON-02)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 3.121.36.175 16509 (AMAZON-02)
3 13.224.196.127 16509 (AMAZON-02)
7 185.22.221.117 60955 (WAVECON)
4 151.101.14.49 54113 (FASTLY)
2 2 18.185.154.43 16509 (AMAZON-02)
1 1 69.173.144.136 26667 (RUBICONPR...)
1 1 40.113.136.100 8075 (MICROSOFT...)
9 151.101.114.49 54113 (FASTLY)
1 1 216.58.207.66 15169 (GOOGLE)
2 2 63.34.164.219 16509 (AMAZON-02)
1 1 35.165.120.69 16509 (AMAZON-02)
1 192.132.33.46 18568 (BIDTELLECT)
1 130.211.13.252 15169 (GOOGLE)
3 3 52.29.161.247 16509 (AMAZON-02)
1 1 185.31.128.129 54312 (ROCKETFUEL)
2 217.79.188.21 24961 (MYLOC-AS)
1 104.111.246.233 16625 (AKAMAI-AS)
3 62.168.44.126 5588 (GTSCE GTS...)
1 172.217.21.230 15169 (GOOGLE)
2 2a00:1450:400... 15169 (GOOGLE)
2 216.58.207.34 15169 (GOOGLE)
11 2.18.232.7 16625 (AKAMAI-AS)
2 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 2 89.163.159.102 24961 (MYLOC-AS)
1 62.168.44.119 5588 (GTSCE GTS...)
4 63.32.86.220 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 62.138.221.190 61157 (PLUSSERVE...)
4 148.251.47.137 24940 (HETZNER-AS)
1 85.114.144.106 24961 (MYLOC-AS)
1 2600:9000:20e... 16509 (AMAZON-02)
2 18.196.191.159 16509 (AMAZON-02)
1 34.250.43.132 16509 (AMAZON-02)
1 34.248.95.73 16509 (AMAZON-02)
1 2.18.233.180 16625 (AKAMAI-AS)
1 104.109.78.125 20940 (AKAMAI-ASN1)
2 151.101.113.108 54113 (FASTLY)
257 80
Apex Domain
Subdomains
Transfer
40 taboola.com
cdn.taboola.com
trc.taboola.com
15.taboola.com
match.taboola.com
cds.taboola.com
vidstat.taboola.com
imprammp.taboola.com
convammp.taboola.com
568 KB
33 giga.de
www.giga.de
static.giga.de
crops.giga.de
videos.giga.de
ssl.1.damoh.giga.de
533 KB
19 doubleclick.net
googleads.g.doubleclick.net
securepubads.g.doubleclick.net
cm.g.doubleclick.net
ad.doubleclick.net
googleads4.g.doubleclick.net
123 KB
14 google-analytics.com
www.google-analytics.com
44 KB
11 teads.tv
a.teads.tv
t.teads.tv
sync.teads.tv
186 KB
9 adtech.de
adserver.adtech.de
2 KB
9 nativendo.de
d.nativendo.de
c.nativendo.de
t.nativendo.de
46 KB
8 googletagservices.com
www.googletagservices.com
185 KB
8 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
ade.googlesyndication.com
137 KB
7 oadts.com
media.oadts.com
121 KB
7 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
4 KB
6 adnxs.com
ib.adnxs.com
acdn.adnxs.com
5 KB
6 adscale.de
ih.adscale.de
native.adscale.de
js.adscale.de
12 KB
6 amazon-adsystem.com
c.amazon-adsystem.com
aax-eu.amazon-adsystem.com
26 KB
5 rubiconproject.com
fastlane.rubiconproject.com
pixel.rubiconproject.com
eus.rubiconproject.com
5 KB
5 meetrics.net
lb67.s400.meetrics.net
1 KB
5 scorecardresearch.com
sb.scorecardresearch.com
3 KB
5 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
14 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 ibillboard.com
video-adserver.ibillboard.com
tracker-adserver.ibillboard.com
bbcdn-bbnaut.ibillboard.com
3 KB
4 advertising.com
adserver-eu.adtech.advertising.com
1 KB
4 adform.net
adx.adform.net
track.adform.net
2 KB
4 stroeermediabrands.de
js.stroeermediabrands.de
gocp.stroeermediabrands.de
82 KB
3 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
14 KB
3 bidswitch.net
x.bidswitch.net
1 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
62 KB
3 smartadserver.com
prg.smartadserver.com
4 KB
3 otto.de
orbidder.otto.de
433 B
3 giga-abs.de
go.giga-abs.de
2 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 yieldlove-ad-serving.net
api.yieldlove-ad-serving.net
587 B
2 consensu.org
cmp.teads.mgr.consensu.org
2 2mdn.net
s0.2mdn.net
41 KB
2 adition.com
ad2.adfarm1.adition.com
2 adsrvr.org
match.adsrvr.org
893 B
2 mfadsrvr.com
rtb.mfadsrvr.com
1 KB
2 amazonaws.com
s3.eu-central-1.amazonaws.com
1 KB
2 fastly.net
confiant-integrations.global.ssl.fastly.net
23 KB
2 openx.net
yieldlove-d.openx.net
eu-u.openx.net
4 KB
2 districtm.io
dmx.districtm.io
cdn.districtm.io
415 B
2 pubmatic.com
hbopenbid.pubmatic.com
ads.pubmatic.com
11 KB
2 googleapis.com
imasdk.googleapis.com
ajax.googleapis.com
122 KB
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 google.com
adservice.google.com
apis.google.com
17 KB
2 facebook.com
www.facebook.com
519 B
2 vgwort.de
ssl-econa.met.vgwort.de
733 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 consentric.de
pixel.consentric.de
354 B
1 mookie1.com
de-gmtdmp.mookie1.com
496 B
1 rfihub.com
p.rfihub.com
701 B
1 bttrack.com
bttrack.com
380 B
1 storygize.net
www.storygize.net
449 B
1 powerlinks.com
px.powerlinks.com
402 B
1 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
343 B
1 giga-video.de
files.giga-video.de
30 KB
1 casalemedia.com
as-sec.casalemedia.com
901 B
1 bootstrapcdn.com
maxcdn.bootstrapcdn.com
10 KB
1 dkuim.de
dkuim.de
151 KB
1 dunkirkinception.com
www.dunkirkinception.com
446 B
1 userreport.com
nugmw.userreport.com
2 KB
1 nuggad.net
si.nuggad.net
598 B
1 mxcdn.net
s400.mxcdn.net
48 KB
1 yieldlove.com
cdn-a.yieldlove.com
89 KB
1 google.de
adservice.google.de
171 B
1 speedcurve.com
cdn.speedcurve.com
7 KB
257 65
Domain Requested by
15 www.giga.de www.giga.de
14 www.google-analytics.com www.giga.de
www.google-analytics.com
13 securepubads.g.doubleclick.net 1 redirects js.stroeermediabrands.de
securepubads.g.doubleclick.net
www.giga.de
12 trc.taboola.com 5 redirects cdn.taboola.com
www.giga.de
9 adserver.adtech.de 6 redirects www.giga.de
8 vidstat.taboola.com cdn.taboola.com
vidstat.taboola.com
8 match.taboola.com www.giga.de
vidstat.taboola.com
8 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
www.googletagservices.com
s0.2mdn.net
7 media.oadts.com www.giga.de
media.oadts.com
7 static.giga.de www.giga.de
6 t.teads.tv www.giga.de
6 cdn.taboola.com www.giga.de
cdn.taboola.com
www.googletagservices.com
6 tracking.m6r.eu 2 redirects www.giga.de
cdn.m6r.eu
media.oadts.com
6 videos.giga.de www.giga.de
videos.giga.de
text
5 lb67.s400.meetrics.net www.giga.de
5 sb.scorecardresearch.com 1 redirects cdn.taboola.com
www.giga.de
4 ssl.1.damoh.giga.de text
4 a.teads.tv www.giga.de
a.teads.tv
4 adserver-eu.adtech.advertising.com 4 redirects
4 ib.adnxs.com 2 redirects cdn-a.yieldlove.com
4 c.amazon-adsystem.com www.giga.de
c.amazon-adsystem.com
4 pagead2.googlesyndication.com www.giga.de
pagead2.googlesyndication.com
3 convammp.taboola.com
3 track.adform.net 1 redirects www.giga.de
js.stroeermediabrands.de
3 t.nativendo.de c.nativendo.de
3 x.bidswitch.net 3 redirects
3 hgc-cf-cache-1.svonm.com videos.giga.de
text
3 fastlane.rubiconproject.com cdn-a.yieldlove.com
3 prg.smartadserver.com cdn-a.yieldlove.com
3 orbidder.otto.de cdn-a.yieldlove.com
3 ih.adscale.de www.giga.de
js.adscale.de
3 tpc.googlesyndication.com securepubads.g.doubleclick.net
www.giga.de
tpc.googlesyndication.com
3 c.nativendo.de d.nativendo.de
c.nativendo.de
www.giga.de
3 go.giga-abs.de www.giga.de
3 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 de.ioam.de 2 redirects www.giga.de
3 d.nativendo.de www.giga.de
c.nativendo.de
3 gocp.stroeermediabrands.de www.giga.de
gocp.stroeermediabrands.de
2 acdn.adnxs.com cdn-a.yieldlove.com
2 uss.xplosion.de www.giga.de
2 api.yieldlove-ad-serving.net cdn-a.yieldlove.com
2 ups.xplosion.de js.stroeermediabrands.de
cdn.emetriq.de
2 cmp.teads.mgr.consensu.org a.teads.tv
2 s0.2mdn.net www.giga.de
s0.2mdn.net
2 js.adscale.de c.nativendo.de
js.stroeermediabrands.de
2 video-adserver.ibillboard.com media.oadts.com
2 ad2.adfarm1.adition.com js.stroeermediabrands.de
2 match.adsrvr.org 2 redirects
2 rtb.mfadsrvr.com 2 redirects
2 s3.eu-central-1.amazonaws.com videos.giga.de
text
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 aax-eu.amazon-adsystem.com 1 redirects c.amazon-adsystem.com
2 www.facebook.com www.giga.de
2 ssl-econa.met.vgwort.de 1 redirects www.giga.de
1 ade.googlesyndication.com
1 eu-u.openx.net cdn-a.yieldlove.com
1 eus.rubiconproject.com cdn-a.yieldlove.com
1 cdn.districtm.io cdn-a.yieldlove.com
1 ads.pubmatic.com cdn-a.yieldlove.com
1 adstax-match.adrtx.net cdn.adrtx.net
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.giga.de
1 cdn.emetriq.de ups.xplosion.de
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 pixel.consentric.de
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com js.stroeermediabrands.de
1 dmp.theadex.com js.stroeermediabrands.de
1 sync.teads.tv a.teads.tv
1 tracker-adserver.ibillboard.com www.giga.de
1 googleads4.g.doubleclick.net www.giga.de
1 ad.doubleclick.net www.googletagservices.com
1 imprammp.taboola.com www.giga.de
1 native.adscale.de c.nativendo.de
1 p.rfihub.com 1 redirects
1 cds.taboola.com www.giga.de
1 bttrack.com www.giga.de
1 www.storygize.net 1 redirects
1 cm.g.doubleclick.net 1 redirects
1 px.powerlinks.com 1 redirects
1 pixel.rubiconproject.com 1 redirects
1 15.taboola.com cdn.taboola.com
1 d.agkn.com js.agkn.com
1 cdn.stroeerdigitalmedia.de www.giga.de
1 files.giga-video.de www.giga.de
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 dmx.districtm.io cdn-a.yieldlove.com
1 as-sec.casalemedia.com cdn-a.yieldlove.com
1 adx.adform.net cdn-a.yieldlove.com
1 hbopenbid.pubmatic.com cdn-a.yieldlove.com
1 cdn.m6r.eu js.stroeermediabrands.de
1 maxcdn.bootstrapcdn.com www.giga.de
1 ajax.googleapis.com www.giga.de
1 apis.google.com www.giga.de
1 dkuim.de www.giga.de
1 imasdk.googleapis.com videos.giga.de
1 js.agkn.com js.stroeermediabrands.de
1 www.dunkirkinception.com www.giga.de
1 nugmw.userreport.com www.giga.de
1 si.nuggad.net 1 redirects
1 s400.mxcdn.net js.stroeermediabrands.de
1 cdn-a.yieldlove.com js.stroeermediabrands.de
1 adservice.google.com pagead2.googlesyndication.com
1 adservice.google.de pagead2.googlesyndication.com
1 irqs.ioam.de script.ioam.de
1 crops.giga.de www.giga.de
1 js.stroeermediabrands.de www.giga.de
1 script.ioam.de www.giga.de
1 cdn.speedcurve.com www.giga.de
257 109
Subject Issuer Validity Valid
*.giga.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-02
2 years crt.sh
a3.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-10-06 -
2020-09-10
a year crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.stroeermediabrands.de
RapidSSL RSA CA 2018
2018-09-06 -
2020-12-05
2 years crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-09-17 -
2019-12-10
3 months crt.sh
*.met.vgwort.de
Thawte RSA CA 2018
2018-05-22 -
2020-03-25
2 years crt.sh
*.facebook.com
DigiCert SHA2 High Assurance Server CA
2019-09-22 -
2019-12-20
3 months crt.sh
*.google-analytics.com
GTS CA 1O1
2019-09-17 -
2019-12-10
3 months crt.sh
c.amazon-adsystem.com
Amazon
2018-12-18 -
2019-11-21
a year crt.sh
*.nativendo.de
Thawte TLS RSA CA G1
2019-04-30 -
2021-05-29
2 years crt.sh
*.google.com
GTS CA 1O1
2019-09-17 -
2019-12-10
3 months crt.sh
*.giga-abs.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-09-04
2 years crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
a year crt.sh
cdn-a.yieldlove.com
Amazon
2019-10-02 -
2020-11-02
a year crt.sh
*.mxcdn.net
DigiCert SHA2 Secure Server CA
2018-09-27 -
2019-11-26
a year crt.sh
*.userreport.com
RapidSSL RSA CA 2018
2019-01-10 -
2021-03-10
2 years crt.sh
www.dunkirkinception.com
Amazon
2019-05-22 -
2020-06-22
a year crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
ssl379338.cloudflaressl.com
COMODO ECC Domain Validation Secure Server CA 2
2019-05-06 -
2019-11-12
6 months crt.sh
*.googleapis.com
GTS CA 1O1
2019-09-17 -
2019-12-10
3 months crt.sh
*.dkuim.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-03
2 years crt.sh
*.apis.google.com
GTS CA 1O1
2019-09-17 -
2019-12-10
3 months crt.sh
f2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-07-30 -
2020-07-25
a year crt.sh
*.scorecardresearch.com
COMODO RSA Organization Validation Secure Server CA
2018-11-28 -
2019-12-26
a year crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2019-09-17 -
2019-12-10
3 months crt.sh
aax-eu.amazon-adsystem.com
Amazon
2019-09-18 -
2020-08-26
a year crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
*.bootstrapcdn.com
Sectigo RSA Domain Validation Secure Server CA
2019-09-14 -
2020-10-13
a year crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.pubmatic.com
Sectigo RSA Organization Validation Secure Server CA
2019-02-22 -
2021-02-21
2 years crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years crt.sh
san.casalemedia.com
GeoTrust RSA CA 2018
2019-07-17 -
2020-03-09
8 months crt.sh
districtm.io
CloudFlare Inc ECC CA-2
2019-03-26 -
2020-03-26
a year crt.sh
*.adtech.de
GeoTrust RSA CA 2018
2019-08-07 -
2021-08-07
2 years crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years crt.sh
orbidder.otto.de
Let's Encrypt Authority X3
2019-08-24 -
2019-11-22
3 months crt.sh
*.smartadserver.com
Thawte RSA CA 2018
2018-09-07 -
2020-02-17
a year crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-01-02 -
2020-01-03
a year crt.sh
*.giga-video.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-01-01
a year crt.sh
*.s3.eu-central-1.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-09-06 -
2020-12-10
a year crt.sh
cdn.stroeerdigitalgroup.de
DigiCert ECC Secure Server CA
2018-12-04 -
2020-03-04
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
*.oadts.com
RapidSSL TLS RSA CA G1
2018-05-02 -
2020-06-30
2 years crt.sh
g2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-05-03 -
2019-11-19
7 months crt.sh
*.bttrack.com
Sectigo RSA Domain Validation Secure Server CA
2019-03-19 -
2021-04-13
2 years crt.sh
*.taboola.com
DigiCert ECC Secure Server CA
2019-09-03 -
2020-09-10
a year crt.sh
*.adfarm1.adition.com
AlphaSSL CA - SHA256 - G2
2019-06-03 -
2021-06-03
2 years crt.sh
*.adscale.de
DigiCert SHA2 Secure Server CA
2019-02-19 -
2020-05-20
a year crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
*.doubleclick.net
GTS CA 1O1
2019-09-17 -
2019-12-10
3 months crt.sh
teads.tv
Let's Encrypt Authority X3
2019-08-22 -
2019-11-20
3 months crt.sh
teads.mgr.consensu.org
Let's Encrypt Authority X3
2019-09-23 -
2019-12-22
3 months crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2018-02-16 -
2019-10-19
2 years crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-12-10 -
2020-02-08
a year crt.sh
*.mookie1.com
DigiCert SHA2 Secure Server CA
2019-02-07 -
2020-03-22
a year crt.sh
pixel.consentric.de
GlobalSign Organization Validation CA - SHA256 - G2
2019-05-02 -
2020-05-02
a year crt.sh
ssl.1.damoh.giga.de
Let's Encrypt Authority X3
2019-09-04 -
2019-12-03
3 months crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
api.yieldlove-ad-serving.net
Let's Encrypt Authority X3
2019-08-15 -
2019-11-13
3 months crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh
cdn.adnxs.com
GlobalSign CloudSSL CA - SHA256 - G3
2019-05-16 -
2020-05-16
a year crt.sh

This page contains 35 frames:

Primary Page: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Frame ID: F1AFE54C75D57D341F60D1142DD71669
Requests: 171 HTTP requests in this frame

Frame: https://videos.giga.de/embed/176875?autoplay=0
Frame ID: 92E8E583C08E0959086D29671C7E1154
Requests: 19 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20191001/r20190131/zrt_lookup.html
Frame ID: B76092CB188B0CD2DC890DEF4737E673
Requests: 1 HTTP requests in this frame

Frame: https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Frame ID: 6DA163DA2D3A9C26F14BD9B4916D432B
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1570413942&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&dt=1570413941886&bpp=8&bdt=100&fdt=116&idt=117&shv=r20191001&cbv=r20190131&saldr=aa&abxe=1&correlator=5562691758464&frm=20&pv=2&ga_vid=1229370929.1570413942&ga_sid=1570413942&ga_hid=374764461&ga_fc=0&iag=0&icsg=8799358291960&dssz=55&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21060548&oid=3&pvsid=2326595187208601&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=oGZwR48fNu&p=https%3A//www.giga.de&dtd=129
Frame ID: 78DEBFB6F09612BCB34DB700B73CDCCB
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1570413942&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1570413941930&bpp=6&bdt=143&fdt=106&idt=106&shv=r20191001&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=5562691758464&frm=20&pv=1&ga_vid=1229370929.1570413942&ga_sid=1570413942&ga_hid=374764461&ga_fc=0&iag=0&icsg=35197433167816&dssz=57&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21060548&oid=3&pvsid=2326595187208601&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&dtd=109
Frame ID: C695785D61F431C954FE9606D5CD51DF
Requests: 1 HTTP requests in this frame

Frame: https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Frame ID: 3C26695BBAD197D48D0C2B77BC98846A
Requests: 1 HTTP requests in this frame

Frame: https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Frame ID: EABD91BFCA590850C74CE46D0CCD3F9B
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=643541859&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Frame ID: 96BB75AA59417A295D06E138648C2181
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssaZoi-yoQElVMZsMfwRpQt1gaXPxfeRmYeaG5CX5_jnZki5691tANm8z1_JkcVC_bLjqesoUTPunraL7M3KOqzQYWv0uXOh_wYHRxtJm_XnG1F-B4cUtuy2zfDDWwijB1FvFrRoeAuGlzRSjXHB5iPYABW7BBBXEGWzvbZ9Kh-dS5YHNp8kIBp2Ejc0LsVC-XIJ-dsXrYfeX4V0lDejiX5ic9_WaeHonqWezfTMWzIMDQ7alaYnFRCLHzFI_vRaU6UeJmKjGqgmE7xluBTuan-Kw&sig=Cg0ArKJSzP2xM2qSZjLLEAE&urlfix=1&adurl=
Frame ID: 2DC8734C1B002792DF01615B44981A52
Requests: 14 HTTP requests in this frame

Frame: https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=f0f7c4cd-14aa-4b2a-99dc-ae0e8a13817b
Frame ID: 17C973D9C8C8295FE266FD17CDB04307
Requests: 11 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvbwEHzHHQ5P3zngJjp9HadxSuRPRP-ZT3MOjEeHGiUt0fciPDmUYxfoVmTnLgaBFfXl126vCyFjpwXtjp54UgVgsscLtt4UGEoxtlE3HsjJJeHhdTS-yb6FUcNi1akIpUf1rRLQ2O9zLdxSIdsB2YvfhYlPN3XSRBuCQ48NcjnKEWdifTXzYbMXGZBkFitXk52eOrvNYE3sHYFn8Y7OTgr2JQ7KtXuuffTjtqXkYopePUCHBopLPvgaHgKa8ub2bLkanl-heQuOWK85G-ECab_OuqWHdk-gsWwvaMB_hQV&sig=Cg0ArKJSzPXtEM-mIg2_EAE&urlfix=1&adurl=
Frame ID: 68D0115198D694A695CCCB5BF6DF79B2
Requests: 2 HTTP requests in this frame

Frame: https://ad2.adfarm1.adition.com/banner?sid=3957066&ts=24599407&kid=3368837&bid=10459665&wpt=H&clickurl=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjssshs6TjhBzKIRhnJvC0pIzrFz2RYVI4GyJumEmWf7648HkvKeZx0_tMcVAFkLmFn0JSLN-y_6EeDwmJqIjaWZjDjrZa8UgDIZJ__pAhwBlhpqt49Un2q341b8H2gQLhhol2PC55LlY7nhvnrBtBgcsEk1bUa4ubKXw0KfJj3aC4K9Xa0cR_P4WJJDh4JNw8DZb2Au0ImNcOV3QbMEeFa1ioZifgzoKpE11g4YCYlgs12_RE3SzjzkuBQPh-tSu_SLWDLpHkRZEpyJepA&sig=Cg0ArKJSzKsgnrNrKPrZEAE&urlfix=1&adurl=
Frame ID: FCF5EA3FC14CC51907C1CC91841F5846
Requests: 1 HTTP requests in this frame

Frame: https://ad2.adfarm1.adition.com/banner?sid=3957067&ts=24599407&kid=3368837&bid=10459664&wpt=H&clickurl=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjssshs6TjhBzKIRhnJvC0pIzrFz2RYVI4GyJumEmWf7648HkvKeZx0_tMcVAFkLmFn0JSLN-y_6EeDwmJqIjaWZjDjrZa8UgDIZJ__pAhwBlhpqt49Un2q341b8H2gQLhhol2PC55LlY7nhvnrBtBgcsEk1bUa4ubKXw0KfJj3aC4K9Xa0cR_P4WJJDh4JNw8DZb2Au0ImNcOV3QbMEeFa1ioZifgzoKpE11g4YCYlgs12_RE3SzjzkuBQPh-tSu_SLWDLpHkRZEpyJepA&sig=Cg0ArKJSzKsgnrNrKPrZEAE&urlfix=1&adurl=
Frame ID: 40D622A7F8C209C2F31DD439FC5504B2
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuoHAWhs0hCrbu7z4Ja4JtWejBGcRFMq0DxVhYKCLmUler4DF4ovfxqnO33JdkLCg4-mEEFDjaovbH7FOR7_hWMVQ6JTRlUgiCaMhLTeTJiaSkn_mZcornVkODlfWg3WXneckFddncoS36QFi9qwd4lrhbrcBN-0W1Hw7u6ewB08TcsvfdctJZIKubZdxaojOVKClWxrcBwUY2aFXBG7uW2vMSeg_QFVLL4cmJOqFS-hlfJtVXYJ762RJlLUE6qmj_G0co0RFh4zorIcRCOEXFDwFImQYhi9ptMVyzKXmBR&sig=Cg0ArKJSzELrHrfmK5KwEAE&urlfix=1&adurl=
Frame ID: 5A6BEDDBCFE3C5AB29EA6AE791E817F2
Requests: 2 HTTP requests in this frame

Frame: https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=AE029AE7B24855586605357985&cicmp=1657475&cijs=1&dast=V7fssCFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNVsMJsvJajmbQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfb5ZcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAFAfDue7Wl93ocH1edn8AADwEgAAADCiQAAzgNJUAVOQcnAAAAAAAAAAAsPz____HAOgRn8kAZCgN3hj0ADz4ADwIAQAAZA2dOzdvb1z71hAVJBYxAgAAAIBkavM4mtQJlUUVAABBuhXAFQBAQNvo_YVDlu6gxFsYAAAAwdgCPSx-v9lh1_jdLgMAAAAAAAAAMPs_-0cTIhpzSwtiKeBV-wUEAFj7BQQAYFM3AIC3ALigI2jFYLA6g5hsRrvJ7AAAAADu_v____VAZDmcmWyr2WazWQ5Xi83KY5m4Zh7bbORxTJzD2fZCYz9kw1VgYvpGhGX2-w4KyunpMbsMMpbLZFALZE2Ty28QHzQMy8kgmN-ELUaryWSzHM6Wi8lgOBqORvsTuNEAJ2g4HCx2g8VusRhOFpPRYDlYoEAMJjghw9FmshrtVrvJcjgZjWabyQYpWrWajTaD4Wo2me12q-FguByNkKI1i9lkspiNlrvNYDkZDYaT4RBhxuIcTCYT01rmWy3Xos1o5VaObLO1yrlZbIYL58i18KxFr4_ptBxNJjPbFgUDlPYiuEgnmtPl73JZ3pq3xa1z-hwWsURzskgnssu-shzOTLbVbLPZLIerxWblsUxcM49tNvI4Js7hbN-xOAeTycS0lvlWy7VoM1q5lSPbbK1ybhab4cI5ci08a9HrYzotR5PJzLZvrHaD0WKzHE32jdVuMFpslqPJvkNn-K4-Z6PyplV4hMbnM-U3zJwGhctg8f4kpsW0Ozt4fr-jU6W6aIwN2TehMBs8BoMilghOF-lE9DKeLmKJ5GmRTpSTxWDhWq6Wu-Fis9qsJovNaDMceRwmi2U0MWwmYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HhhiN5rrZXDFYzjWDVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HlQEkdgoA!&excid=22&tst=1&docw=0&cs=false
Frame ID: E1B8F437B6D5115419E4D3397DDE2443
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuXslEUWCPd8xKm5qX5wWinCzJ5K2VPSWEzAy45neaZ38bL8ECTxLTkQl8vGDWsjcCtTpqVh48WBLjhgdqaWFg8cEbe1JQAqA3mNfJDs0ax3qAYWKpKQ5UzuR1fPBDTGOBp8YqBnAwQ6AnE-ifmp3COJGZdXwTggtxpBlTVddal9u3FyQqQm1Qw5WcAaqPOwHNHj-4mNGkiVoiZo_dXkSzVL6Sh7It-XqiMZgKCuAnWeZq48TeRGBrnD-8zUMPs01gsvu9rn5o7xpe2vkLk41PImYpMTHU30bN9mscN&sig=Cg0ArKJSzJjov8fXLXpiEAE&urlfix=1&adurl=
Frame ID: 194DF92BD99E53E939C26DAE51D4C69D
Requests: 13 HTTP requests in this frame

Frame: https://ih.adscale.de/map?format=display&ssl=1
Frame ID: 2B2826BCE70B66CDD9887289E914392A
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/sodar/Enqz_20U.html
Frame ID: D332B5B9052AFB69195A6A4EDF17F01F
Requests: 1 HTTP requests in this frame

Frame: https://s0.2mdn.net/9452533/1569406398250/cc.html
Frame ID: BBDF46F956FABA39AE854D1D994188E3
Requests: 1 HTTP requests in this frame

Frame: https://cmp.teads.mgr.consensu.org/index.html
Frame ID: B0C63E7B04AAEC48B956CA76BC5FA175
Requests: 1 HTTP requests in this frame

Frame: https://cmp.teads.mgr.consensu.org/index.html
Frame ID: C62E8FBBAE19FB0B0BC58A9F86FF13F7
Requests: 1 HTTP requests in this frame

Frame: https://match.taboola.com/sync?dast=V7fssCFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNVsMJsvJajmbQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfb5ZcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAFAfDue7Wl93ocH1edn8AADwEgAAADCiQAAzgNJUAVOQcnAAAAAAAAAAAsPz____HAOgRn8kAZCgN3hj0ADz4ADwIAQAAZA2dOzdvb1z71hAVJBYxAgAAAIBkavM4mtQJlUUVAABBuhXAFQBAQNvo_YVDlu6gxFsYAAAAwdgCPSx-v9lh1_jdLgMAAAAAAAAAMPs_-0cTIhpzSwtiKeBV-wUEAFj7BQQAYFM3AIC3ALigI2jFYLA6g5hsRrvJ7AAAAADu_v____VAZDmcmWyr2WazWQ5Xi83KY5m4Zh7bbORxTJzD2fZCYz9kw1VgYvpGhGX2-w4KyunpMbsMMpbLZFALZE2Ty28QHzQMy8kgmN-ELUaryWSzHM6Wi8lgOBqORvsTuNEAJ2g4HCx2g8VusRhOFpPRYDlYoEAMJjghw9FmshrtVrvJcjgZjWabyQYpWrWajTaD4Wo2me12q-FguByNkKI1i9lkspiNlrvNYDkZDYaT4RBhxuIcTCYT01rmWy3Xos1o5VaObLO1yrlZbIYL58i18KxFr4_ptBxNJjPbFgUDlPYiuEgnmtPl73JZ3pq3xa1z-hwWsURzskgnssu-shzOTLbVbLPZLIerxWblsUxcM49tNvI4Js7hbN-xOAeTycS0lvlWy7VoM1q5lSPbbK1ybhab4cI5ci08a9HrYzotR5PJzLZvrHaD0WKzHE32jdVuMFpslqPJvkNn-K4-Z6PyplV4hMbnM-U3zJwGhctg8f4kpsW0Ozt4fr-jU6W6aIwN2TehMBs8BoMilghOF-lE9DKeLmKJ5GmRTpSTxWDhWq6Wu-Fis9qsJovNaDMceRwmi2U0MWwmYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HhhiN5rrZXDFYzjWDVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HlQEkdgoA!&excid=22&docw=0&cijs=1
Frame ID: 500ECA123AA80F5A171490B1E30DFEDA
Requests: 1 HTTP requests in this frame

Frame: https://sync.teads.tv/iframe?pid=76332&userId=12888522-f0d9-430c-82ec-240ffc72dc7d&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1570413943249
Frame ID: 7AD517E0B24B9932D5456009F0E5BD23
Requests: 1 HTTP requests in this frame

Frame: data://truncated
Frame ID: F033D44D389B2FDC7BC0A2E2C1B30396
Requests: 1 HTTP requests in this frame

Frame: https://uss.xplosion.de/usersync?sid=65966&fpid=4205968101957315115
Frame ID: 282F57D60E20F3315BD3FC1E74195E87
Requests: 1 HTTP requests in this frame

Frame: https://adstax-match.adrtx.net/activation?receiverId=adaud
Frame ID: B7FED70EA0133E23D33ECA3619EC9E0B
Requests: 1 HTTP requests in this frame

Frame: https://ads.pubmatic.com/AdServer/js/showad.js
Frame ID: 59AA9A17D90DA2A5A2DCBB07901F2BB9
Requests: 1 HTTP requests in this frame

Frame: https://cdn.districtm.io/ids/index.html
Frame ID: 56AC39233965FD09C22385A69846158A
Requests: 1 HTTP requests in this frame

Frame: https://eus.rubiconproject.com/usync.html
Frame ID: 89DA31AB7C0E99EF746257D3AB4A103E
Requests: 1 HTTP requests in this frame

Frame: https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Frame ID: BDFB53D525AC15CF6EEB8F53C292625E
Requests: 1 HTTP requests in this frame

Frame: https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Frame ID: 9B4AB4F94456F30C789A2B7874F34B4A
Requests: 1 HTTP requests in this frame

Frame: https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Frame ID: 16C04E5F707B4AA7DA1C17125BFA36B9
Requests: 1 HTTP requests in this frame

Frame: https://match.taboola.com/sync?dast=V7fssCFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNVsMJsvJajmbQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfb5ZcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAFAfDue7Wl93ocH1edn8AADwEgAAADCiQAAzgNJUAVOQcnAAAAAAAAAAAsPz____HAOgRn8kAZCgN3hj0ADz4ADwIAQAAZA2dOzdvb1z71hAVJBYxAgAAAIBkavM4mtQJlUUVAABBuhXAFQBAQNvo_YVDlu6gxFsYAAAAwdgCPSx-v9lh1_jdLgMAAAAAAAAAMPs_-0cTIhpzSwtiKeBV-wUEAFj7BQQAYFM3AIC3ALigI2jFYLA6g5hsRrvJ7AAAAADu_v____VAZDmcmWyr2WazWQ5Xi83KY5m4Zh7bbORxTJzD2fZCYz9kw1VgYvpGhGX2-w4KyunpMbsMMpbLZFALZE2Ty28QHzQMy8kgmN-ELUaryWSzHM6Wi8lgOBqORvsTuNEAJ2g4HCx2g8VusRhOFpPRYDlYoEAMJjghw9FmshrtVrvJcjgZjWabyQYpWrWajTaD4Wo2me12q-FguByNkKI1i9lkspiNlrvNYDkZDYaT4RBhxuIcTCYT01rmWy3Xos1o5VaObLO1yrlZbIYL58i18KxFr4_ptBxNJjPbFgUDlPYiuEgnmtPl73JZ3pq3xa1z-hwWsURzskgnssu-shzOTLbVbLPZLIerxWblsUxcM49tNvI4Js7hbN-xOAeTycS0lvlWy7VoM1q5lSPbbK1ybhab4cI5ci08a9HrYzotR5PJzLZvrHaD0WKzHE32jdVuMFpslqPJvkNn-K4-Z6PyplV4hMbnM-U3zJwGhctg8f4kpsW0Ozt4fr-jU6W6aIwN2TehMBs8BoMilghOF-lE9DKeLmKJ5GmRTpSTxWDhWq6Wu-Fis9qsJovNaDMceRwmi2U0MWwmYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HhhiN5rrZXDFYzjWDVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HlQEkdgoA!&excid=22&docw=0&cijs=1
Frame ID: A9AB1E96018C68B6DD0B86531A8B2349
Requests: 1 HTTP requests in this frame

Frame: https://match.taboola.com/sync?dast=V7fssCFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNVsMJsvJajmbQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfb5ZcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAFAfDue7Wl93ocH1edn8AADwEgAAADCiQAAzgNJUAVOQcnAAAAAAAAAAAsPz____HAOgRn8kAZCgN3hj0ADz4ADwIAQAAZA2dOzdvb1z71hAVJBYxAgAAAIBkavM4mtQJlUUVAABBuhXAFQBAQNvo_YVDlu6gxFsYAAAAwdgCPSx-v9lh1_jdLgMAAAAAAAAAMPs_-0cTIhpzSwtiKeBV-wUEAFj7BQQAYFM3AIC3ALigI2jFYLA6g5hsRrvJ7AAAAADu_v____VAZDmcmWyr2WazWQ5Xi83KY5m4Zh7bbORxTJzD2fZCYz9kw1VgYvpGhGX2-w4KyunpMbsMMpbLZFALZE2Ty28QHzQMy8kgmN-ELUaryWSzHM6Wi8lgOBqORvsTuNEAJ2g4HCx2g8VusRhOFpPRYDlYoEAMJjghw9FmshrtVrvJcjgZjWabyQYpWrWajTaD4Wo2me12q-FguByNkKI1i9lkspiNlrvNYDkZDYaT4RBhxuIcTCYT01rmWy3Xos1o5VaObLO1yrlZbIYL58i18KxFr4_ptBxNJjPbFgUDlPYiuEgnmtPl73JZ3pq3xa1z-hwWsURzskgnssu-shzOTLbVbLPZLIerxWblsUxcM49tNvI4Js7hbN-xOAeTycS0lvlWy7VoM1q5lSPbbK1ybhab4cI5ci08a9HrYzotR5PJzLZvrHaD0WKzHE32jdVuMFpslqPJvkNn-K4-Z6PyplV4hMbnM-U3zJwGhctg8f4kpsW0Ozt4fr-jU6W6aIwN2TehMBs8BoMilghOF-lE9DKeLmKJ5GmRTpSTxWDhWq6Wu-Fis9qsJovNaDMceRwmi2U0MWwmYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HhhiN5rrZXDFYzjWDVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HlQEkdgoA!&excid=22&docw=0&cijs=1
Frame ID: 0D323AE48C214F525F5B4BADB121759D
Requests: 1 HTTP requests in this frame

Screenshot


Detected technologies

Overall confidence: 100%
Detected patterns
  • headers server /nginx(?:\/([\d.]+))?/i

Overall confidence: 100%
Detected patterns
  • script /googlesyndication\.com\//i

Overall confidence: 100%
Detected patterns
  • script /google-analytics\.com\/(?:ga|urchin|analytics)\.js/i

Overall confidence: 100%
Detected patterns
  • html /<iframe[^>]* (?:id="comscore"|scr=[^>]+comscore)|\.scorecardresearch\.com\/beacon\.js|COMSCORE\.beacon/i
  • script /\.scorecardresearch\.com\/beacon\.js|COMSCORE\.beacon/i

Page Statistics

257
Requests

99 %
HTTPS

20 %
IPv6

65
Domains

109
Subdomains

80
IPs

9
Countries

2750 kB
Transfer

8341 kB
Size

69
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 18
  • https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1 HTTP 302
  • https://ssl-econa.met.vgwort.de/blank.gif
Request Chain 25
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=0011028c08bbd87495d9a9d75&ep=1598873775&vr=415&id=sxnjyl&i3=0011028c08bbd87495d9a9d75%3A1599617141833%3A1570413941833%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1570413941833&n1=3&dntt=0&lt=1570413941834&ev=&cs=fdwl0o&mo=0 HTTP 302
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=0011028c08bbd87495d9a9d75&ep=1598873775&vr=415&id=sxnjyl&i3=0011028c08bbd87495d9a9d75%3A1599617141833%3A1570413941833%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1570413941833&n1=3&dntt=0&lt=1570413941834&ev=&cs=fdwl0o&mo=0&sr=71 HTTP 302
  • https://de.ioam.de/blank.gif
Request Chain 34
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software HTTP 302
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Request Chain 38
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 39
  • 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 HTTP 302
  • https://nugmw.userreport.com/rc-ap/fa3f29d6-4151-4bf4-b535-2115bed70417/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
Request Chain 81
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox HTTP 302
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Request Chain 94
  • 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=1570413942336; HTTP 302
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1570413942336 HTTP 302
  • https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6658212/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1570413942336 HTTP 302
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;apid=1Af77124d4-e8a6-11e9-8592-0251fbe596fc;cfp=1;rndc=1570413941;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1570413942336
Request Chain 95
  • 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=1570413942336; HTTP 302
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1570413942336 HTTP 302
  • https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6670994/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=1;rndc=1570413941;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1570413942336 HTTP 302
  • https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6670994/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=2;rndc=1570413941;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1570413942336 HTTP 302
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;apid=1Af772beb6-e8a6-11e9-b479-02d96b951e4e;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1570413942336
Request Chain 96
  • 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=1570413942336; HTTP 302
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;cfp=1;rndc=1570413941;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1570413942336 HTTP 302
  • https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6669693/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1570413942336 HTTP 302
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;apid=1Af77062a6-e8a6-11e9-9cb3-02d013b6d92e;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1570413942336
Request Chain 111
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1570413942403&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9= HTTP 302
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1570413942403&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
Request Chain 117
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstTTHB1CX-2HAe6Wfr17oWiXDwzyVdNYWETOCMQnkYIoQXzGXh1izPDMcJpvZzZYhH2sTUoWmfEbI_zWHSfceOJO8CpYvlkxLKF9TRsW8Pd8D1w1uU-94aj6UknWmHT1gnknnDGcsM8UufO4fRxaGzZy1hLPwd9vcIwp6F29fjZZpt0oaY3IyrFct_D1gBJOJBqA5iPRwdRuqNf584z7SCUb9pVTBNlo51GyXsQul0kfR5HZzWYioKGyzsXo1DpkTT0QZYIGFxbOknrMhr9lw&sig=Cg0ArKJSzOWKrKqAsD_pEAE&urlfix=1&adurl=//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif HTTP 302
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Request Chain 132
  • https://rtb.mfadsrvr.com/sync?ssp=taboola HTTP 302
  • https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola HTTP 302
  • https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=f0f7c4cd-14aa-4b2a-99dc-ae0e8a13817b
Request Chain 133
  • https://pixel.rubiconproject.com/exchange/sync.php?p=16698 HTTP 302
  • https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
Request Chain 134
  • https://px.powerlinks.com/user/identify?sourceId=d4a7a706-ab0f-11e8-a038-127202fb7690&rurl=https%3A%2F%2Ftrc.taboola.com%2Fsg%2Fpowerlinksdsp-network%2F1%2Frtb-h%2F%3Ftaboola_hm%3D%24%7BUSER%7D HTTP 302
  • https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=jIMVISTUgJuT_iWfIQO6sqUn-lnHmVLZ3KkSl4zpv38%3D
Request Chain 135
  • https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=$UID HTTP 302
  • https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=5753789694147878808 HTTP 302
  • https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=5753789694147878808&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3D5753789694147878808
Request Chain 136
  • https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm&google_sc HTTP 302
  • https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEJdrx925eSGnIouS5MMOTeU&google_cver=1 HTTP 302
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEJdrx925eSGnIouS5MMOTeU&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3DCAESEJdrx925eSGnIouS5MMOTeU%26google_cver%3D1
Request Chain 137
  • https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=$UID HTTP 302
  • https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=5753789694147878808
Request Chain 138
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1 HTTP 302
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=054f32o&ttd_tpi=1 HTTP 302
  • https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=a5969358-6387-4fe7-b1d5-f68c41be58c2 HTTP 302
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=a5969358-6387-4fe7-b1d5-f68c41be58c2&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3Da5969358-6387-4fe7-b1d5-f68c41be58c2
Request Chain 139
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6 HTTP 302
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=61b9918d-43a9-43f7-9bdd-71fab3ed17c8 HTTP 302
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=61b9918d-43a9-43f7-9bdd-71fab3ed17c8&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3D61b9918d-43a9-43f7-9bdd-71fab3ed17c8
Request Chain 142
  • https://x.bidswitch.net/sync?ssp=taboola HTTP 302
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola HTTP 302
  • https://p.rfihub.com/cm?in=1&pub=20513&ssp=taboola HTTP 302
  • https://x.bidswitch.net/sync?dsp_id=119&user_id=1041527795736575752&expires=30&ssp=taboola HTTP 302
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=45c3066d-0d0a-47c3-b958-7454d059a5f1 HTTP 302
  • https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=45c3066d-0d0a-47c3-b958-7454d059a5f1&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3D45c3066d-0d0a-47c3-b958-7454d059a5f1
Request Chain 173
  • https://track.adform.net/adfserve/?bn=32440758;1x1inv=1;srctype=3;ord=1570413942 HTTP 302
  • https://track.adform.net/adfserve/?CC=1&bn=32440758;1x1inv=1;srctype=3;ord=1570413942
Request Chain 242
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBi_-Bsb8BsRCESUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D HTTP 307
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4205968101957315115

257 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
141 KB
52 KB
Document
General
Full URL
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
cb496b247c889c5000fd46f5db122068028d830d27c60305c21570ac3daef57c

Request headers

:method
GET
:authority
www.giga.de
:scheme
https
:path
/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
navigate
sec-fetch-user
?1
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
none
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
navigate
Sec-Fetch-User
?1

Response headers

status
200
server
nginx
content-type
text/html; charset=UTF-8
vary
Accept-Encoding
date
Mon, 07 Oct 2019 02:05:41 GMT
x-page-speed
1.13.35.2-0
cache-control
max-age=0, no-cache
content-encoding
gzip
source-sans-pro-v11-latin-700.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
15 KB
15 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-700.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:41 GMT
last-modified
Fri, 04 Oct 2019 15:52:56 GMT
server
nginx
accept-language
bytes
etag
"5d976ad8-3c78"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15480
expires
Tue, 06 Oct 2020 02:05:41 GMT
source-sans-pro-v11-latin-600.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
15 KB
16 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-600.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:41 GMT
last-modified
Fri, 04 Oct 2019 15:52:56 GMT
server
nginx
accept-language
bytes
etag
"5d976ad8-3da8"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15784
expires
Tue, 06 Oct 2020 02:05:41 GMT
source-sans-pro-v11-latin-regular.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
16 KB
16 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-regular.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:41 GMT
last-modified
Fri, 04 Oct 2019 15:52:56 GMT
server
nginx
accept-language
bytes
etag
"5d976ad8-3e24"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15908
expires
Tue, 06 Oct 2020 02:05:41 GMT
lux.js
cdn.speedcurve.com/js/
19 KB
7 KB
Script
General
Full URL
https://cdn.speedcurve.com/js/lux.js?id=131387135
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.217 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
Apache /
Resource Hash
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

strict-transport-security
max-age=15768000
content-encoding
gzip
age
25207
x-cache
HIT
status
200
content-length
6462
x-served-by
cache-fra19143-FRA
access-control-allow-origin
*
last-modified
Sun, 06 Oct 2019 19:05:34 GMT
server
Apache
x-timer
S1570413942.815298,VS0,VE0
date
Mon, 07 Oct 2019 02:05:41 GMT
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
via
1.1 varnish
expires
Mon, 07 Oct 2019 19:05:34 GMT
cache-control
max-age=86400
accept-ranges
bytes
timing-allow-origin
*
x-cache-hits
2003
pre-42ce728b8c.js
www.giga.de/static-local/dist/assets/js/
59 KB
19 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/pre-42ce728b8c.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_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
b6258767d399255ae820aafbcc32919a70ba5bcb3a3e24e142a5ec1d65fa282d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 01 Oct 2019 14:51:53 GMT
content-encoding
gzip
x-original-content-length
60608
server
nginx
status
200
etag
W/"5d9367ce-ecc0"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
19337
expires
Wed, 30 Sep 2020 14:51:53 GMT
main-desktop-5e42e16aff.css
www.giga.de/static-local/dist/assets/css/
365 KB
51 KB
Stylesheet
General
Full URL
https://www.giga.de/static-local/dist/assets/css/main-desktop-5e42e16aff.css
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
3cddc2e86e4eb1938c7839c370626f1d75ce9308959399c7956b5ea9c2a7d334

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 01 Oct 2019 08:10:19 GMT
content-encoding
gzip
x-original-content-length
374172
server
nginx
status
200
etag
W/"5d9309ad-5b59c"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/css
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
51423
expires
Wed, 30 Sep 2020 08:10:18 GMT
iam.js
script.ioam.de/
34 KB
11 KB
Script
General
Full URL
https://script.ioam.de/iam.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
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.10 0011
Resource Hash
785c06447334e88d0142b9b9bde0ce6ed34b903e8d545dcb3e5822b8b82f0288

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:41 GMT
Content-Encoding
gzip
Last-Modified
Mon, 07 Oct 2019 02:05:41 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 0011
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
private, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Mon, 07 Oct 2019 04:05:41 GMT
metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js
js.stroeermediabrands.de/
248 KB
60 KB
Script
General
Full URL
https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.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_256_GCM
Server
46.253.113.178 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
eda2393686a684774ae90de15de274aebde04ab429882c6fed9404add2cb8702

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:41 GMT
content-encoding
gzip
last-modified
Wed, 02 Oct 2019 09:09:02 GMT
server
nginx/1.14.1
vary
Accept-Encoding
content-type
application/javascript
status
200
cache-control
max-age=31536000, public immutable max-age=31536000
expires
Tue, 06 Oct 2020 02:05:41 GMT
2501-rcm40x40.jpg
static.giga.de/wp-content/uploads/2015/05/
796 B
1 KB
Image
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

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 19 Sep 2019 14:38:47 GMT
x-content-type-options
nosniff
age
1510014
filer-source
ca7b44b53d5a66e850355c11821198c504e518f8f12b295bd9c54d22bb538e08
x-cache
HIT
status
200
accept-language
bytes
content-length
796
x-xss-protection
1; mode=block
last-modified
Thu, 19 Sep 2019 14:38:47 GMT
server
nginx/1.10.3
filer-attr
W1s0MCw0MF0sInNodXR0bGUtdjEiLFsiRlJBLTEiXSxbIkZSQi0xIl1d
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sat, 19 Oct 2019 14:38:47 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
105 KB
36 KB
Script
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:825::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
1d79549e195135a533efe5e9c4e19d44cd999283045607304a34ab122676d1ae
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:41 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
36885
x-xss-protection
0
server
cafe
etag
15645551647234501358
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Mon, 07 Oct 2019 02:05:41 GMT
paypal-login-deutsch-rcm960x0.jpg
static.giga.de/wp-content/uploads/2015/07/
18 KB
19 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/07/paypal-login-deutsch-rcm960x0.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
f94e032d892cd03ec8d2e87a139d5598ff586ffd4ddccd14d0cef518730c0821
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 09 Sep 2019 04:05:34 GMT
x-content-type-options
nosniff
age
2412007
filer-source
3dc62a8e18f9b6ceb94ecf895297d72ce0545c5156c00f0fa8e434dc55d3102e
x-cache
HIT
status
200
accept-language
bytes
content-length
18921
x-xss-protection
1; mode=block
last-modified
Sat, 07 Sep 2019 12:36:06 GMT
server
nginx/1.10.3
filer-attr
W1s4OTAsNDg1XSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 07 Oct 2019 12:36:06 GMT
2845a21346beaba2f3d1db455b_YyAxODk1eDYzNysxMisxNzACcmUgNjI1IDIxMAMwZDI1MTZhMmRiNQ==.jpg
crops.giga.de/0a/ad/ab/
16 KB
17 KB
Image
General
Full URL
https://crops.giga.de/0a/ad/ab/2845a21346beaba2f3d1db455b_YyAxODk1eDYzNysxMisxNzACcmUgNjI1IDIxMAMwZDI1MTZhMmRiNQ==.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
a0611e486e87faf678d732cede5f2b94c26550f87a9e8baf6393ac3e8f96268b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 25 Sep 2019 05:48:36 GMT
x-content-type-options
nosniff
age
1023425
filer-source
833cb36a650161e736193aec5c3891398d2fa56a03e872ecb4014e0c343af106
x-cache
HIT
status
200
accept-language
bytes
content-length
16480
x-xss-protection
1; mode=block
last-modified
Wed, 25 Sep 2019 05:48:36 GMT
server
nginx/1.10.3
filer-attr
W1s2MjUsMjEwXSwic3RpLXYzIixbIkZSQS0xIl0sWyJGUkItMSJdXQ==
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Fri, 25 Oct 2019 05:48:36 GMT
PayPal-Login-Page-rcm464x0.jpg
static.giga.de/wp-content/uploads/2015/07/
21 KB
21 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/07/PayPal-Login-Page-rcm464x0.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
2f58ccf14355919dfa5815bebd82d775161bdf2707480201bd8b2334778c0412
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sat, 05 Oct 2019 05:49:49 GMT
x-content-type-options
nosniff
age
159352
filer-source
7154c03f1279d42875baf477c69c8abd717043148b5dba0c147151812277507b
x-cache
HIT
status
200
accept-language
bytes
content-length
21316
x-xss-protection
1; mode=block
last-modified
Mon, 09 Sep 2019 04:05:34 GMT
server
nginx/1.10.3
filer-attr
W1s0MTUsNTczXSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Wed, 09 Oct 2019 04:05:34 GMT
iDevice-Manager-Artikelbild-rcm200x113.jpg
static.giga.de/wp-content/uploads/2012/03/
8 KB
8 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2012/03/iDevice-Manager-Artikelbild-rcm200x113.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
3abcb6200574ebc02b948e70b0cd405539ed5b7658962fb9874b7ad0e0b91ffd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 06 Oct 2019 18:35:43 GMT
x-content-type-options
nosniff
age
26998
filer-source
776b7960538669c1b2e536320fb3b780908f8bdde2785aaa973e23ca53c19591
x-cache
HIT
status
200
accept-language
bytes
content-length
7844
x-xss-protection
1; mode=block
last-modified
Tue, 10 Sep 2019 22:34:02 GMT
server
nginx/1.10.3
filer-attr
W1syMDAsMTEzXSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Thu, 10 Oct 2019 22:34:02 GMT
CopyTrans-Manager-Artikelbild-rcm200x113.jpg
static.giga.de/wp-content/uploads/2015/10/
5 KB
6 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/10/CopyTrans-Manager-Artikelbild-rcm200x113.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
e89386e8282008db91f4835571a2b36b124b6295bc29a5aa274373c72942366e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 06 Oct 2019 21:42:20 GMT
x-content-type-options
nosniff
age
15801
filer-source
9eddf04429738d711186cb82513cd2bc836262760d8ce68ba7a80adffa72bf44
x-cache
HIT
status
200
accept-language
bytes
content-length
5531
x-xss-protection
1; mode=block
last-modified
Sat, 07 Sep 2019 16:34:29 GMT
server
nginx/1.10.3
filer-attr
W1syMDAsMTEzXSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 07 Oct 2019 16:34:29 GMT
WinScan2PDF-Artikelbild-rcm200x113.jpg
static.giga.de/wp-content/uploads/2016/01/
5 KB
6 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2016/01/WinScan2PDF-Artikelbild-rcm200x113.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
8a1037b891212285bd46c6bb6d410d5f925cb070d6b40a0efdafddb36d26c0eb
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 06 Oct 2019 16:29:37 GMT
x-content-type-options
nosniff
age
34564
filer-source
04c08aa1cb62d6ce4879769d9740ca1ddf3fe5b3d34935a88acf1a37ee87148a
x-cache
HIT
status
200
accept-language
bytes
content-length
5371
x-xss-protection
1; mode=block
last-modified
Sat, 05 Oct 2019 23:51:20 GMT
server
nginx/1.10.3
filer-attr
W1syMDAsMTEzXSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 04 Nov 2019 23:51:20 GMT
Siri-Geld-verschicken-PayPal-rcm235x129.jpg
static.giga.de/wp-content/uploads/2016/11/
6 KB
6 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2016/11/Siri-Geld-verschicken-PayPal-rcm235x129.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 09 Sep 2019 04:05:35 GMT
x-content-type-options
nosniff
age
2412006
filer-source
8fa6d82067b578ca8e6bb273bed34f9d123e3ee778a1db1a4f9ea350b5447154
x-cache
HIT
status
200
accept-language
bytes
content-length
5657
x-xss-protection
1; mode=block
last-modified
Mon, 09 Sep 2019 04:05:35 GMT
server
nginx/1.10.3
filer-attr
W1syMzUsMTI5XSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Wed, 09 Oct 2019 04:05:35 GMT
trackcp.js
gocp.stroeermediabrands.de/
27 KB
10 KB
Script
General
Full URL
https://gocp.stroeermediabrands.de/trackcp.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
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
01bd64076f129e4393e7cc464ae93d4ab379bdd8b814e195b75711315ebc3b4c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:41 GMT
Content-Encoding
gzip
Last-Modified
Fri, 04 Oct 2019 12:54:25 GMT
ETag
"5d974101-6dfc"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=86400, max-age=31536000, public
X-Machine
hn87 gocp env
Accept-Ranges
bytes
Expires
Tue, 08 Oct 2019 02:05:41 GMT
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
  • https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1
  • https://ssl-econa.met.vgwort.de/blank.gif
43 B
310 B
Image
General
Full URL
https://ssl-econa.met.vgwort.de/blank.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
161.156.66.178 , United States, ASN36351 (SOFTLAYER - SoftLayer Technologies Inc., US),
Reverse DNS
b2.42.9ca1.ip4.static.sl-reverse.com
Software
s2.50.19 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Mon, 07 Oct 2019 02:05:41 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
s2.50.19
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

Date
Mon, 07 Oct 2019 02:05:41 GMT
Last-Modified
Mon, 07 Oct 2019 02:05:41 GMT
Server
s2.50.19
Access-Control-Allow-Origin
*
Transfer-Encoding
chunked
Content-Type
text/html
Location
/blank.gif
Cache-Control
max-age=0, no-cache, must-revalidate, proxy-revalidate
Connection
keep-alive
Expires
Tue, 22 Aug 2000 15:05:01 GMT
tr
www.facebook.com/
44 B
321 B
Image
General
Full URL
https://www.facebook.com/tr?id=1773162896260346&ev=PageView&noscript=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.3, , AES_128_GCM
Server
2a03:2880:f12d:83:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:41 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
status
200
cache-control
no-cache, must-revalidate, max-age=0
content-length
44
expires
Mon, 07 Oct 2019 02:05:41 GMT
tr
www.facebook.com/
44 B
198 B
Image
General
Full URL
https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
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
2a03:2880:f12d:83:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:41 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
status
200
cache-control
no-cache, must-revalidate, max-age=0
content-length
44
expires
Mon, 07 Oct 2019 02:05:41 GMT
analytics.js
www.google-analytics.com/
43 KB
17 KB
Script
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-42ce728b8c.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 19 Aug 2019 17:22:41 GMT
server
Golfe2
age
6935
date
Mon, 07 Oct 2019 00:10:06 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
17803
expires
Mon, 07 Oct 2019 02:10:06 GMT
apstag.js
c.amazon-adsystem.com/aax2/
76 KB
22 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/apstag.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-42ce728b8c.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.192.201.129 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-192-201-129.fra50.r.cloudfront.net
Software
Server /
Resource Hash
f7125e9d8093f0f30262921eeecd071159a4737e7504a2d36f3f0672a9620ca8

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 06 Oct 2019 16:23:22 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA50
etag
4393133803fad77a6f14361035f74d6e
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
accept-ranges
bytes
x-amz-cf-id
ZSew5EyHk2xrxmU8N-I9MqW0HI9mlmIa5H2sD4zr9p0IlibP-KdSzw==
via
1.1 528e50fb19578ca598eb8f9e2157ef09.cloudfront.net (CloudFront)
init
d.nativendo.de/cds/delivery/
991 B
918 B
Script
General
Full URL
https://d.nativendo.de/cds/delivery/init
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
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
4330193cc2f6442925c50f1f9c9bf19ed4fe8a23012bbbdfe0e5626453809eeb

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:41 GMT
content-encoding
gzip
last-modified
Mon, 07 Oct 2019 02:05:41 GMT
server
Apache
vary
Accept-Encoding
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
516
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
identitystatus
irqs.ioam.de/
25 B
202 B
XHR
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.5036448131393065
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

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:41 GMT
server
nginx
status
200
vary
Origin
content-type
application/vnd.api+json
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
strict-transport-security
max-age=15768000
blank.gif
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=0011028c08bbd87495d9a9d75&ep=1598873775&vr=415&i...
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=0011028c08bbd87495d9a9d75&ep=1598873775&vr=415&i...
  • https://de.ioam.de/blank.gif
43 B
651 B
Image
General
Full URL
https://de.ioam.de/blank.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.40 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de4.ioam.de
Software
nginx /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:41 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Cache-Control
max-age=86400
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
image/gif
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Content-Length
43
Expires
Tue, 08 Oct 2019 02:05:41 GMT

Redirect headers

Date
Mon, 07 Oct 2019 02:05:41 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.05.0 0025
Transfer-Encoding
chunked
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Connection
keep-alive
Pragma
no-cache
Last-Modified
Mon, 07 Oct 2019 02:05:41 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/blank.gif
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Sun, 07 Oct 2018 02:05:41 GMT
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
9 KB
10 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/fontello/fontello.woff2?62585758
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
1b35bd23206a199b500fdb41aa9dd3ddedb9cbfdd2f1b1da79c5a3f916e737e5

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/static-local/dist/assets/css/main-desktop-5e42e16aff.css
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:41 GMT
last-modified
Fri, 04 Oct 2019 15:52:56 GMT
server
nginx
accept-language
bytes
etag
"5d976ad8-25d8"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
9688
expires
Tue, 06 Oct 2020 02:05:41 GMT
176875
videos.giga.de/embed/ Frame 92E8
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/176875?autoplay=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
35637b2df493cc121a7ffc815aa9fadf81ae3f0199e524af5ebe73c7f254e3b7

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/176875?autoplay=0
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
same-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
pc=1; ioam2018=0011028c08bbd87495d9a9d75:1599617141833:1570413941833:.giga.de:2:giga:software_content:noevent:1570413941833:xlnt78
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx/1.14.1
date
Mon, 07 Oct 2019 02:05:41 GMT
content-type
text/html;charset=UTF-8
link
<https://videos.giga.de/embed/176875>; rel="canonical"
content-encoding
gzip
bg-teaser.png
www.giga.de/wp-content/themes/project/assets/img/teaser/
647 B
865 B
Image
General
Full URL
https://www.giga.de/wp-content/themes/project/assets/img/teaser/bg-teaser.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.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
265de6b562fdaf225b6713104b74342ffe97177ac67505d9e799e3acfa56352b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/static-local/dist/assets/css/main-desktop-5e42e16aff.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 28 Mar 2019 00:02:44 GMT
server
nginx
accept-language
bytes
etag
"5c9a42da-287"
status
200
access-control-allow-methods
GET
content-type
image/png
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
647
expires
Fri, 27 Mar 2020 00:02:44 GMT
integrator.js
adservice.google.de/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.giga.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Mon, 07 Oct 2019 02:05:41 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
integrator.js
adservice.google.com/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.giga.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Mon, 07 Oct 2019 02:05:41 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20191001/r20190131/
232 KB
85 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20191001/r20190131/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:825::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
c71c456b8b74f5012aedb9b0116007e263b5bff4e181e9cd685bb8508cc01e1e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:41 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
87351
x-xss-protection
0
server
cafe
etag
2696100448618732083
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Mon, 07 Oct 2019 02:05:41 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20191001/r20190131/ Frame B760
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20191001/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:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/html/r20191001/r20190131/zrt_lookup.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
vary
Accept-Encoding
date
Tue, 01 Oct 2019 13:36:55 GMT
expires
Tue, 15 Oct 2019 13:36:55 GMT
content-type
text/html; charset=UTF-8
etag
12554163127653827101
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
7390
x-xss-protection
0
cache-control
public, max-age=1209600
age
476926
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
z.js
go.giga-abs.de/
1 KB
1 KB
Script
General
Full URL
https://go.giga-abs.de/z.js?0.6801094454905441
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:41 GMT
X-Content-Type-Options
nosniff
Last-Modified
Mon, 07 Oct 2019 02:05:41 GMT
Server
X/1.0
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Content-Length
1040
Expires
Tue, 08 Oct 2019 02:05:36 GMT
Cookie set iframe
tracking.m6r.eu/pixel/ Frame 6DA1
Redirect Chain
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
0
0
Document
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.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash

Request headers

Host
tracking.m6r.eu
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
test=true
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
nginx
Content-Type
text/html; charset=utf-8
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Content-Encoding
gzip
Date
Mon, 07 Oct 2019 02:05:41 GMT
Content-Length
1534
Connection
keep-alive
Vary
Accept-Encoding
Set-Cookie
id=f6a5f661ec1b9b0662b946c7bcdf53f3; Max-Age=7776000; Domain=m6r.eu; Path=/; Expires=Sun, 05 Jan 2020 02:05:41 GMT

Redirect headers

Server
nginx
Content-Type
text/html; charset=utf-8
Content-Length
302
Location
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Date
Mon, 07 Oct 2019 02:05:41 GMT
Connection
keep-alive
Set-Cookie
test=true; Max-Age=3600; Domain=m6r.eu; Path=/; Expires=Mon, 07 Oct 2019 03:05:41 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
44 KB
14 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
c09e9928aa285e1fcfc2dece1b02f5b8acc9492b15fe46fe61dfe125364d5c66
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:41 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"301 / 17 of 1000 / last-modified: 1570118832"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14351
x-xss-protection
0
expires
Mon, 07 Oct 2019 02:05:41 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
287 KB
89 KB
Script
General
Full URL
https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.78.101 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-78-101.fra2.r.cloudfront.net
Software
/ Express
Resource Hash
959a6d8d7c97c22f7d01c2b239cf80c2bc97a3d0c8c8f4db167c97a4549d816d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 01:19:20 GMT
content-encoding
gzip
age
2781
status
200
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=10800
x-amz-cf-pop
FRA2-C2
x-amz-cf-id
pkAh7_o9E-gKD9i5WDfEk_bHARVBnoO03OmPgOX3-u84gzl8JuUwwg==
via
1.1 e56e6732f380db727425bac2d6158761.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
124 KB
48 KB
Script
General
Full URL
https://s400.mxcdn.net/bb-mx/serve/mtrcs_679600.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.67 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-67.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:41 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Cache-Control
public, max-age=7200
Connection
keep-alive
Content-Type
text/javascript
Content-Length
49094
Expires
Mon, 07 Oct 2019 04:05:41 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
97 B
599 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?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.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
95cf2ca8cb6cdba5cc7d928903181838546d6120525ebbf7bd0a221eb986f70b

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:42 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
108

Redirect headers

Date
Mon, 07 Oct 2019 02:05:41 GMT
Server
nginx
Access-Control-Allow-Origin
https://www.giga.de
Content-Type
text/plain; charset=utf-8
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72
nuggad
nugmw.userreport.com/rc-ap/fa3f29d6-4151-4bf4-b535-2115bed70417/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/fa3f29d6-4151-4bf4-b535-2115bed70417/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2...
2 KB
2 KB
Script
General
Full URL
https://nugmw.userreport.com/rc-ap/fa3f29d6-4151-4bf4-b535-2115bed70417/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:21f3:9600:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
c1059373fb55a87ac98c82bdd1e03e08c17ffc03d619efc9597f1db49bc8b8d5

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 216b2e0a8a27f8fca1b540a1c4ea6922.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA2-C2
access-control-allow-methods
get, post, options
content-type
text/javascript
status
200
cache-control
s-maxage=0, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
1835
x-amz-cf-id
isuxt1WqpQYuHSURROez137gt6Q5Ax_9gpJC0V5RiqmQlPAdo5X7Kw==

Redirect headers

date
Mon, 07 Oct 2019 02:05:41 GMT
via
1.1 d6b9c7bad28b271f1e800a50d49ab8a4.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA2-C2
status
302
access-control-allow-methods
get, post, options
location
https://nugmw.userreport.com/rc-ap/fa3f29d6-4151-4bf4-b535-2115bed70417/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
cache-control
s-maxage=0, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
0
x-amz-cf-id
SxB5f4oFxFNmCqCmyyJg7k2UoRD9AgLXpdZwzmKVerfgZX3MaN0d5A==
ad-loading.gif
www.dunkirkinception.com/detect/
135 B
446 B
Image
General
Full URL
https://www.dunkirkinception.com/detect/ad-loading.gif?p=imagey/
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.29.62 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-29-62.eu-central-1.compute.amazonaws.com
Software
/ TSAdServer
Resource Hash
93459448f77700adf95ec8e1c28d4be3f6e5980bcb8de09e7f45c13704338c23

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:41 GMT
X-Powered-By
TSAdServer
ETag
W/"87-ehDIq3wOJ6NCL06CBXEjoHysAlk"
Content-Type
image/png
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
X-Robots-Tag
noindex, nofollow
Content-Length
135
tag.js
js.agkn.com/prod/v0/
3 KB
3 KB
Script
General
Full URL
https://js.agkn.com/prod/v0/tag.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2043:dc00:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 01 Aug 2019 18:51:23 GMT
via
1.1 2db316290386960b489a2a16c0a63643.cloudfront.net (CloudFront)
last-modified
Thu, 11 Jul 2019 15:46:11 GMT
server
AmazonS3
age
86563
etag
"a5442c681a576408c25edbf365995343"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA54
accept-ranges
bytes
content-length
3167
x-amz-cf-id
nV3jTGH3YLdRg7k5nGVayZbgPKsABmoC2Dn4aj8lULtvke-8Oy7b8w==
js
www.google-analytics.com/gtm/
81 KB
26 KB
Script
General
Full URL
https://www.google-analytics.com/gtm/js?id=GTM-KRW4T6J&t=gt1&cid=1229370929.1570413942&aip=true
Requested by
Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
3c6a050e6d0da4731ca515e80879208d7415df609352addccd6b58f3d02b841a
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:41 GMT
content-encoding
br
server
Google Tag Manager
access-control-allow-headers
Cache-Control
status
200
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
http://www.googletagmanager.com
cache-control
private, max-age=900
access-control-allow-credentials
true
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
26113
x-xss-protection
0
expires
Mon, 07 Oct 2019 02:05:41 GMT
post-bf3f8d8abd.js
www.giga.de/static-local/dist/assets/js/bundle/
7 KB
3 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/bundle/post-bf3f8d8abd.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-42ce728b8c.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
af0229418c42d613178908fba3b9c1b058fab24d9694426b011d46aecc782508

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 01 Oct 2019 14:51:53 GMT
content-encoding
gzip
x-original-content-length
7061
server
nginx
status
200
etag
W/"5d9367cd-1b95"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2682
expires
Wed, 30 Sep 2020 14:51:53 GMT
giga-6b59f15322.js
www.giga.de/static-local/dist/assets/js/bundle/
31 KB
12 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/bundle/giga-6b59f15322.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-42ce728b8c.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
f6c88d72ddbc86769c79cd60c2fbffac3679934dca3c2173dc8f919bcbbbfd64

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 09 Jul 2019 13:23:25 GMT
content-encoding
gzip
x-original-content-length
31346
server
nginx
status
200
etag
W/"5d2494e5-7a72"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
11745
expires
Wed, 08 Jul 2020 13:23:25 GMT
smb-phone-plan-ef34ebe4f8.js
www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/
53 KB
18 KB
Script
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/static-local/dist/assets/js/pre-42ce728b8c.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 11 Sep 2019 09:34:16 GMT
content-encoding
gzip
x-original-content-length
54000
server
nginx
status
200
etag
W/"5d78bf3c-d2f0"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
18237
expires
Thu, 10 Sep 2020 09:34:16 GMT
bid
c.amazon-adsystem.com/e/dtb/
122 B
503 B
XHR
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=7740602087601570413941990&cb=9239846422041570413941992&ws=1600x1200&v=7.36.05&t=1000&slots=%5B%7B%22sd%22%3A%22banner-1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%22sky-2%22%2C%22s%22%3A%5B%22160x600%22%2C%22300x600%22%5D%2C%22sn%22%3A%22sky%22%7D%2C%7B%22sd%22%3A%22rectangle-4%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.192.201.129 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-192-201-129.fra50.r.cloudfront.net
Software
Server /
Resource Hash
257280261952cc16f2188219f80c334cd855a9188a26147802509493ae809b38

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA50
status
200
vary
Accept-Encoding,User-Agent
x-cache
Miss from cloudfront
content-type
text/javascript;charset=UTF-8
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
timing-allow-origin
*
content-length
131
via
1.1 528e50fb19578ca598eb8f9e2157ef09.cloudfront.net (CloudFront)
x-amz-cf-id
3O_eD1uHIIZ_xeJBGvBzFe8rzdmJ4Iqmz0H0vTxbMwsG0TVjqTlvLw==
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
3 KB
XHR
General
Full URL
https://c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js
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
54.192.201.129 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-192-201-129.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 06 Oct 2019 20:14:45 GMT
content-encoding
gzip
vary
Accept-Encoding,Origin
age
21057
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
*
last-modified
Fri, 24 Aug 2018 07:13:51 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
via
1.1 147e057d2f96cf5a0082d96978e38a5b.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA50
x-amz-cf-id
6MIMDVNbPG85R0Ab0a07MFgQ7BxaEUPiEcPZPnzjjmVcC9KC2pLYJQ==
article-rating-7143c629e5.js
www.giga.de/static-local/dist/assets/js/components/
306 B
534 B
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/components/article-rating-7143c629e5.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-42ce728b8c.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 28 Mar 2019 00:02:44 GMT
content-encoding
gzip
x-original-content-length
306
server
nginx
accept-language
bytes
status
200
etag
"5c9a4313-132"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
234
expires
Fri, 27 Mar 2020 00:02:44 GMT
loader.js
c.nativendo.de/cdn/asset/js/
53 KB
17 KB
Script
General
Full URL
https://c.nativendo.de/cdn/asset/js/loader.js?v=1170
Requested by
Host: d.nativendo.de
URL: https://d.nativendo.de/cds/delivery/init
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:ac0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
8169f1c80996bcbacc8733474b782be494a43f9fcc6e049554bd1e88818f81d6

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 google
cf-cache-status
HIT
age
847177
cf-polished
origSize=54525
status
200
content-encoding
br
alt-svc
clear
cf-bgj
minify
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=31536000
cf-ray
521c4fc1bafacbac-VIE
expires
Tue, 06 Oct 2020 02:05:42 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 78DE
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1570413942&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&dt=1570413941886&bpp=8&bdt=100&fdt=116&idt=117&shv=r20191001&cbv=r20190131&saldr=aa&abxe=1&correlator=5562691758464&frm=20&pv=2&ga_vid=1229370929.1570413942&ga_sid=1570413942&ga_hid=374764461&ga_fc=0&iag=0&icsg=8799358291960&dssz=55&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21060548&oid=3&pvsid=2326595187208601&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=oGZwR48fNu&p=https%3A//www.giga.de&dtd=129
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191001/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1570413942&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&dt=1570413941886&bpp=8&bdt=100&fdt=116&idt=117&shv=r20191001&cbv=r20190131&saldr=aa&abxe=1&correlator=5562691758464&frm=20&pv=2&ga_vid=1229370929.1570413942&ga_sid=1570413942&ga_hid=374764461&ga_fc=0&iag=0&icsg=8799358291960&dssz=55&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21060548&oid=3&pvsid=2326595187208601&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=oGZwR48fNu&p=https%3A//www.giga.de&dtd=129
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
test_cookie=CheckForPermission
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
content-encoding
br
date
Mon, 07 Oct 2019 02:05:42 GMT
server
cafe
content-length
21391
x-xss-protection
0
set-cookie
IDE=AHWqTUkBHw18OYZ19SDi_Tq9RJMESDAG-SeHkKLwVZDX4uvDG9WwJ1nlyZzClBa0; expires=Sat, 31-Oct-2020 02:05:42 GMT; path=/; domain=.doubleclick.net; HttpOnly test_cookie=; domain=.doubleclick.net; path=/; expires=Mon, 21 Jul 2008 23:59:00 GMT
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Mon, 07 Oct 2019 02:05:42 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
77 KB
29 KB
Script
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/r20191001/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
03cdd154a67240548616e679dde7dd00a53bbfb48697a1635bafef7fd09406c4
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570187668844456"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29127
x-xss-protection
0
expires
Mon, 07 Oct 2019 02:05:42 GMT
o.gif
go.giga-abs.de/
35 B
355 B
Image
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=1570413942021&__it=-120&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:41 GMT
Last-Modified
Tue, 29 Sep 2009 02:03:44 GMT
Server
X/1.0
Content-Type
image/gif
Cache-Control
private, no-cache, no-store, proxy-revalidate, no-transform
Connection
keep-alive
Content-Length
35
Expires
Mon, 01 Oct 2012 02:03:44 GMT
videojs-02e1d46d.min.js
videos.giga.de/dist/js/embed/bundle/ Frame 92E8
618 KB
206 KB
Script
General
Full URL
https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
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
5aeb54f6727af87431148b611f64c2d9608b22f49b71cd313f5e023b0f6ee642

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
last-modified
Tue, 17 Sep 2019 08:48:02 GMT
server
nginx/1.14.1
etag
W/"5d809dc2-9a957"
content-type
application/javascript
status
200
cache-control
max-age=315360000
expires
Thu, 31 Dec 2037 23:55:55 GMT
ima3.js
imasdk.googleapis.com/js/sdkloader/ Frame 92E8
270 KB
92 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
31a7a492b370d48d381afdb515ae3fa6cc0fc724d6fbbffec1cbaa1128bfae45
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
93892
x-xss-protection
0
expires
Mon, 07 Oct 2019 02:05:42 GMT
dkuim.js
dkuim.de/api/js/2/
465 KB
151 KB
Script
General
Full URL
https://dkuim.de/api/js/2/dkuim.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-42ce728b8c.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.65.130 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:42 GMT
Content-Encoding
gzip
Last-Modified
Tue, 11 Dec 2018 15:40:09 GMT
Server
nginx
ETag
W/"5c0fda59-74548"
Transfer-Encoding
chunked
Content-Type
application/javascript
ads
googleads.g.doubleclick.net/pagead/ Frame C695
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1570413942&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1570413941930&bpp=6&bdt=143&fdt=106&idt=106&shv=r20191001&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=5562691758464&frm=20&pv=1&ga_vid=1229370929.1570413942&ga_sid=1570413942&ga_hid=374764461&ga_fc=0&iag=0&icsg=35197433167816&dssz=57&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21060548&oid=3&pvsid=2326595187208601&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&dtd=109
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191001/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:815::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1570413942&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1570413941930&bpp=6&bdt=143&fdt=106&idt=106&shv=r20191001&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=5562691758464&frm=20&pv=1&ga_vid=1229370929.1570413942&ga_sid=1570413942&ga_hid=374764461&ga_fc=0&iag=0&icsg=35197433167816&dssz=57&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21060548&oid=3&pvsid=2326595187208601&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&dtd=109
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
IDE=AHWqTUlqeBS-Nug2NsSS8JgYeC7gbbd9mavbukiaIBb7EecL6s8SG1k2P6PRuVP1
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
date
Mon, 07 Oct 2019 02:05:42 GMT
server
cafe
content-length
0
x-xss-protection
0
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
platform.js
apis.google.com/js/
43 KB
17 KB
Script
General
Full URL
https://apis.google.com/js/platform.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-42ce728b8c.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81f::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
ESF /
Resource Hash
1a560979c35508f894818e1f68012f0a56d6a6001c5dfb73ffeda325fcbafbeb
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-security-policy-report-only
script-src 'report-sample' 'nonce-qDOPAqEwvTrPzrW2XAFd1g' 'unsafe-inline' 'strict-dynamic' https: http: 'unsafe-eval';object-src 'none';base-uri 'self';report-uri /_/cspreport
p3p
CP="This is not a P3P policy! See g.co/p3phelp for more info."
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
x-xss-protection
0
x-ua-compatible
IE=edge, chrome=1
server
ESF
x-frame-options
SAMEORIGIN
etag
"ce8f41226b511978bd0b369f1ffcc6fc"
strict-transport-security
max-age=31536000
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
private, max-age=1800, stale-while-revalidate=1800
timing-allow-origin
*
expires
Mon, 07 Oct 2019 02:05:42 GMT
loader.js
cdn.taboola.com/libtrc/stroeer-smb-giga/
113 KB
22 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/bundle/post-bf3f8d8abd.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
896e5d83ee1b9064b100e896d41174d656e6cd3dcf6bfddbee224d11abe84d49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
6jZEJx6soXZw2mqBx6o__xd7mhpSmPhc
content-encoding
gzip
etag
"e54bf42262c7063ba54308dd3b98f313"
age
70
x-cache
HIT
status
200
content-length
22066
x-amz-id-2
OVjtbO1U5oDi8O9WzDAGhofCwxV5pvdZJYkCAgzSUcTM1bQJN3AVImLDH9QJq+UWdhSwSV+muaQ=
x-served-by
cache-hhn4030-HHN
last-modified
Wed, 02 Oct 2019 12:05:05 GMT
server
AmazonS3
x-timer
S1570413942.049431,VS0,VE1
date
Mon, 07 Oct 2019 02:05:42 GMT
vary
Accept-Encoding
x-amz-request-id
3DBE13617968D623
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
33
x-cache-hits
1
pubads_impl_modern_2019093001.js
securepubads.g.doubleclick.net/gpt/
145 KB
56 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_2019093001.js?21064579
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
a02daf0d08caf745875d512497d9550f081c9c4145bf52adc8ade59e113b3069
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 30 Sep 2019 13:06:17 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
56657
x-xss-protection
0
expires
Mon, 07 Oct 2019 02:05:42 GMT
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame 92E8
53 KB
15 KB
Stylesheet
General
Full URL
https://videos.giga.de/dist/css/videojs-f50f7a8d.css
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
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
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
last-modified
Tue, 17 Sep 2019 08:48:02 GMT
server
nginx/1.14.1
etag
W/"5d809dc2-d280"
content-type
text/css
status
200
cache-control
max-age=315360000
expires
Thu, 31 Dec 2037 23:55:55 GMT
play_button.svg
videos.giga.de/image/ Frame 92E8
1015 B
1 KB
Image
General
Full URL
https://videos.giga.de/image/play_button.svg
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
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
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
"5d1db79a-3f7"
content-type
image/svg+xml
status
200
cache-control
max-age=7776000
accept-ranges
bytes
content-length
1015
expires
Sun, 05 Jan 2020 02:05:42 GMT
tribalad.gS_vERZLM3.gif
www.giga.de/imagey/
71 B
474 B
Image
General
Full URL
https://www.giga.de/imagey/tribalad.gS_vERZLM3.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx / TSAdServer
Resource Hash
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
server
nginx
x-powered-by
TSAdServer
etag
W/"47-ZTbJFDBdJipLHHeF7Zqsus3A1Hc"
content-type
image/png
status
200
cache-control
no-cache, no-store, must-revalidate, no-cache="set-cookie"
x-robots-tag
noindex, nofollow
content-length
71
jquery.min.js
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
85 KB
30 KB
Script
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/static-local/dist/assets/js/pre-42ce728b8c.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 03 Oct 2019 08:39:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
321989
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
30306
x-xss-protection
0
last-modified
Fri, 24 Mar 2017 20:55:54 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
public, max-age=31536000, stale-while-revalidate=2592000
accept-ranges
bytes
timing-allow-origin
*
expires
Fri, 02 Oct 2020 08:39:13 GMT
collect
www.google-analytics.com/r/
35 B
111 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=374764461&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=6GBAAEADQ~&jid=682558490&gjid=1325219668&cid=1229370929.1570413942&tid=UA-204785-4&_gid=161904196.1570413942&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&z=1029089059
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:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=374764461&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEADQ~&jid=&gjid=&cid=1229370929.1570413942&tid=UA-204785-4&_gid=161904196.1570413942&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd21=auto&cm17=1&cd18=4282584&z=366119372
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:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 23 Aug 2019 03:46:39 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3881943
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
110 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=374764461&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=1229370929.1570413942&tid=UA-204785-4&_gid=161904196.1570413942&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm75=1&z=374860595
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:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 23 Aug 2019 03:46:39 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3881943
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=374764461&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal-Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=1229370929.1570413942&tid=UA-204785-4&_gid=161904196.1570413942&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cm75=1&z=818913754
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:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 23 Aug 2019 03:46:39 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3881943
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=374764461&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=1229370929.1570413942&tid=UA-204785-4&_gid=161904196.1570413942&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cm75=1&z=382007336
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:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 23 Aug 2019 03:46:39 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3881943
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=374764461&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEADQ~&jid=&gjid=&cid=1229370929.1570413942&tid=UA-204785-4&_gid=161904196.1570413942&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Image&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cm75=1&z=1872414100
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:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 23 Aug 2019 03:46:39 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3881943
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=374764461&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Android)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=1229370929.1570413942&tid=UA-204785-4&_gid=161904196.1570413942&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cm75=1&z=494722992
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:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 23 Aug 2019 03:46:39 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3881943
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=374764461&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(iOS)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=1229370929.1570413942&tid=UA-204785-4&_gid=161904196.1570413942&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cm75=1&z=807395048
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:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 23 Aug 2019 03:46:39 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3881943
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=374764461&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Windows%20Phone)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=1229370929.1570413942&tid=UA-204785-4&_gid=161904196.1570413942&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cm75=1&z=320944382
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:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 23 Aug 2019 03:46:39 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3881943
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
smb-article-rating-f9506c2d61.min.js
www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/
18 KB
6 KB
Script
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/static-local/dist/assets/js/pre-42ce728b8c.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 20 May 2019 10:18:52 GMT
content-encoding
gzip
x-original-content-length
17937
server
nginx
status
200
etag
W/"5ce27eb5-4611"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
6108
expires
Tue, 19 May 2020 10:18:52 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=374764461&t=event&ni=1&_s=10&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=1229370929.1570413942&tid=UA-204785-4&_gid=161904196.1570413942&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm76=1&z=1386792420
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:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 23 Aug 2019 03:46:39 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3881943
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
impl.20191002-10-RELEASE.js
cdn.taboola.com/libtrc/
394 KB
112 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/impl.20191002-10-RELEASE.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
0cae80c9382e2b3e8045ba09797fd66d1a65a936d70af2eed09897be81ea436e

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
MWFHdpWI_mQOMXUM8TI1gLlg0gl1K5pN
content-encoding
gzip
etag
"c863c8ea08069847bb5c761bac45dda6"
age
20
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
113914
x-amz-id-2
KZQ331HLPwKAM5p4SgPTw91EVwLUW1F6iCeqHyNr6GY8BJhdcyit1/M+5leJD7g4m2xQYShBEKA=
x-served-by
cache-hhn4030-HHN
last-modified
Wed, 02 Oct 2019 22:32:20 GMT
server
AmazonS3
x-timer
S1570413942.176424,VS0,VE0
date
Mon, 07 Oct 2019 02:05:42 GMT
vary
Accept-Encoding
x-amz-request-id
EC5559FF9EDC3E26
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
51
x-cache-hits
27
beacon.js
sb.scorecardresearch.com/
1 KB
1 KB
Script
General
Full URL
https://sb.scorecardresearch.com/beacon.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.214.103 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-214-103.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
76c393f564f53c19e795307e622edc8657a603f7a816c2646385697286d11313

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:42 GMT
Content-Encoding
gzip
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
private, no-transform, max-age=86400
Connection
keep-alive
Content-Length
902
Expires
Tue, 08 Oct 2019 02:05:42 GMT
ads
securepubads.g.doubleclick.net/gampad/
11 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2326595187208601&correlator=4370512350110007&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&adsid=NT&eid=21064579%2C21064366%2C21064581%2C21064687&vrg=2019093001&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191007&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=800x450%7C580x500%7C580x360%7C42x31&scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D7%26smb-hour%3D4%26yt%3D0%26adset%3Dbrsl%26mbrid%3Df6a5f661ec1b9b0662b946c7bcdf53f3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1570413942&dt=1570413942192&dlt=1570413941787&idt=389&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3541345729&uci=1&ifi=2&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=64&icsg=3343636218424&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=625x0&msz=800x450&ga_vid=1229370929.1570413942&ga_sid=1570413942&ga_hid=374764461&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_2019093001.js?21064579
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
3410066bc879980f292295a5e7752eaffafbdb16ee4f4201677731a90290f07b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
4735
x-xss-protection
0
google-lineitem-id
5002100619
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138265057624
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_modern_rendering_2019093001.js
securepubads.g.doubleclick.net/gpt/
59 KB
23 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_rendering_2019093001.js?21064579
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_2019093001.js?21064579
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
25cefebe6cf8e9964f288373af5d6d01c480f3c9264ff6fce1be97dc0e1e2528
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 30 Sep 2019 13:06:17 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
23794
x-xss-protection
0
expires
Mon, 07 Oct 2019 02:05:42 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_2019093001.js?21064579
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

ads
securepubads.g.doubleclick.net/gampad/
3 KB
2 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2326595187208601&correlator=4370512350110007&output=ldjh&callback=googletag.impl.pubads.callbackProxy2&impl=fif&adsid=NT&eid=21064579%2C21064366%2C21064581%2C21064687&vrg=2019093001&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191007&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=1x1&ists=1&scp=as%3Dout-of-page%26adslot%3Dout-of-page%26pc%3D1&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D7%26smb-hour%3D4%26yt%3D0%26adset%3Dbrsl%26mbrid%3Df6a5f661ec1b9b0662b946c7bcdf53f3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1570413942&dt=1570413942202&dlt=1570413941787&idt=389&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2858038163&uci=2&ifi=3&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=65&icsg=3343636218424&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x-1&msz=1x-1&ga_vid=1229370929.1570413942&ga_sid=1570413942&ga_hid=374764461&fws=640&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_2019093001.js?21064579
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
87e1d6a1eede3e7ab13003b0aef9ca46485fd40ffccfef032fca73ad142e0e74
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
1814
x-xss-protection
0
google-lineitem-id
4482388292
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138216245372
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
Cookie set iu3
aax-eu.amazon-adsystem.com/s/ Frame 3C26
Redirect Chain
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
0
0
Document
General
Full URL
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.94.220.16 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash

Request headers

Host
aax-eu.amazon-adsystem.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
ad-id=A0vEJSYIakRRlvXJQ9w01c0|t
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
Server
Date
Mon, 07 Oct 2019 02:05:42 GMT
Content-Type
text/html;charset=ISO-8859-1
Content-Length
181
Connection
keep-alive
Cache-Control
max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0
Pragma
no-cache
Expires
Thu, 01 Jan 1970 00:00:00 GMT
p3p
policyref="https://www.amazon.com/w3c/p3p.xml", CP="PSAo PSDo OUR SAM OTR DSP COR"
Set-Cookie
ad-id=A0vEJSYIakRRlvXJQ9w01c0; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jul-2020 02:05:42 GMT; Path=/; HttpOnly ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jan-2025 02:05:42 GMT; Path=/; HttpOnly
Vary
Accept-Encoding,User-Agent
Content-Encoding
gzip

Redirect headers

Server
Server
Date
Mon, 07 Oct 2019 02:05:42 GMT
Content-Length
0
Connection
keep-alive
Cache-Control
max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0
Pragma
no-cache
Expires
Thu, 01 Jan 1970 00:00:00 GMT
p3p
policyref="https://www.amazon.com/w3c/p3p.xml", CP="PSAo PSDo OUR SAM OTR DSP COR"
Location
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Set-Cookie
ad-id=A0vEJSYIakRRlvXJQ9w01c0|t; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jul-2020 02:05:42 GMT; Path=/; HttpOnly
Vary
User-Agent
submit
lb67.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb67.s400.meetrics.net/bb-mx/submit?/57lyBbAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSVPBPAAAAAAAAAOAAAAGTAAAAAAZwSVPBBRksFAQtjFSkf9SA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Mon, 07 Oct 2019 02:05:41 GMT
data
lb67.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb67.s400.meetrics.net/data?/57lyCbAAATkzFARksFAQtjFqvJNSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 07-Oct-19 02:05:41 GMT
bootstrap.min.js
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
36 KB
10 KB
Script
General
Full URL
https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-42ce728b8c.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2001:4de0:ac19::1:b:1a , Netherlands, ASN20446 (HIGHWINDS3 - Highwinds Network Group, Inc., US),
Reverse DNS
Software
/
Resource Hash
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
last-modified
Wed, 12 Dec 2018 18:33:51 GMT
status
200
etag
"1544639631"
vary
Accept-Encoding
x-cache
HIT
content-type
text/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=31536000
x-hello-human
Say hello back! @getBootstrapCDN on Twitter
accept-ranges
bytes
timing-allow-origin
*
content-length
9832
nuggad
ih.adscale.de/
49 B
487 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d3=4&d1=1&d10=3&d9=2&d4=1&d7=2&d2=3&d11=3&d12=2&d8=2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
49
Expires
Mon, 07 Oct 2019 02:05:42 GMT
api
cdn.m6r.eu/sync/
1 KB
1 KB
Script
General
Full URL
https://cdn.m6r.eu/sync/api
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:42 GMT
Content-Encoding
gzip
Last-Modified
Mon, 16 Sep 2019 12:52:10 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
max-age=86400
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
654
Expires
Tue, 08 Oct 2019 02:05:42 GMT
nativendo.css
c.nativendo.de/cdn/asset/css/
5 KB
1 KB
Stylesheet
General
Full URL
https://c.nativendo.de/cdn/asset/css/nativendo.css?v=1170
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1170
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:ac0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 google
cf-cache-status
HIT
age
847177
cf-polished
origSize=5959
status
200
content-encoding
br
alt-svc
clear
cf-bgj
minify
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
text/css;charset=UTF-8
cache-control
public, max-age=31536000
cf-ray
521c4fc38d57cbac-VIE
expires
Tue, 06 Oct 2020 02:05:42 GMT
bid
c.amazon-adsystem.com/e/dtb/
47 B
389 B
XHR
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=7740602087601570413941990&cb=2161157249791570413942323&ws=1600x1200&v=7.36.05&t=1000&slots=%5B%7B%22sd%22%3A%22banner%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%7D%2C%7B%22sd%22%3A%22sky%22%2C%22s%22%3A%5B%22300x600%22%2C%22160x600%22%2C%22200x600%22%2C%22120x600%22%5D%7D%2C%7B%22sd%22%3A%22rectangle%22%2C%22s%22%3A%5B%22300x250%22%5D%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.192.201.129 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-192-201-129.fra50.r.cloudfront.net
Software
Server /
Resource Hash
b794fd23a82ba1c8cfc0b7495ed4218637dbeb175c84e22c818542dcd414f80e

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 528e50fb19578ca598eb8f9e2157ef09.cloudfront.net (CloudFront)
server
Server
x-amz-cf-pop
FRA50
status
200
vary
User-Agent
x-cache
Miss from cloudfront
content-type
text/javascript;charset=UTF-8
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
timing-allow-origin
*
content-length
47
x-amz-cf-id
zM3oP2nVqX86BzSYgne3IouoxZdKg2GsHBQx1yJFjT9FIiTlw001Lg==
prebid
ib.adnxs.com/ut/v3/
364 B
1 KB
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
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_ECDSA, AES_128_GCM
Server
37.252.173.22 , Ascension Island, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
536.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
54437e58b6b6163e80d3b0d4f6858d329375a3149ad045f9297dfa85a9302876
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:44 GMT
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 536.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.173.88:80
AN-X-Request-Uuid
c57396f0-3511-41aa-b055-e50f2dd86d71
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
364
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
translator
hbopenbid.pubmatic.com/
10 KB
11 KB
XHR
General
Full URL
https://hbopenbid.pubmatic.com/translator?source=prebid-client
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
185.64.189.112 , United Kingdom, ASN62713 (AS-PUBMATIC - PubMatic, Inc., US),
Reverse DNS
Software
/
Resource Hash
0f50fc22b5e00415e92e4737ee79ae6fa96b9f5e52bb0aa5e50a14d1b8f25740

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
200
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, no-store, must-revalidate
x-openrtb-version
2.3
access-control-allow-credentials
true
date
Mon, 07 Oct 2019 02:05:42 GMT
content-type
application/json
/
adx.adform.net/adx/
15 B
411 B
XHR
General
Full URL
https://adx.adform.net/adx/?rp=4&bWlkPTY2NjQ0MyZ0cmFuc2FjdGlvbklkPTJlMGJiNGZmLTdlZDUtNGRhMS1iNzFiLTY0ODM1MGQ4YjUzOQ%3D%3D&bWlkPTcxMzMyNiZ0cmFuc2FjdGlvbklkPThhY2JkZWE1LTEzM2YtNDdmNS1iYThiLWQ2YWFkYTBlNzQ0Yw%3D%3D&bWlkPTcwNjE1MSZ0cmFuc2FjdGlvbklkPTVlOGFhZDg2LTM5MTUtNDgzNS1iZjM3LTg5YjVlZTJkZWJkZQ%3D%3D&pt=gross&stid=af68d924-77d8-4931-aab2-6c8ce83b0104&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.246 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
631bc9fa39ddcdd4008398e649671ba79db3cc7c1725d7b8cd9823ec243f0a48

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
server
nginx
status
200
access-control-max-age
86400
access-control-allow-methods
GET, POST
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, no-store, must-revalidate, no-transform
access-control-allow-credentials
true
content-type
application/json; charset=utf-8
access-control-allow-headers
Content-Type, Cache-Control, Accept-Encoding, X-Requested-With
content-length
15
expires
-1
cygnus
as-sec.casalemedia.com/
25 B
901 B
XHR
General
Full URL
https://as-sec.casalemedia.com/cygnus?s=254711&v=7.2&r=%7B%22id%22%3A%2212cbd92c42b6d16%22%2C%22imp%22%3A%5B%7B%22id%22%3A%221380a380aaa88ac%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22254711%22%2C%22sid%22%3A%221%22%7D%7D%2C%7B%22id%22%3A%2214bdc849ed65813%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%221519fd6c492d772%22%2C%22banner%22%3A%7B%22w%22%3A160%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%22162b588f1edbf14%22%2C%22banner%22%3A%7B%22w%22%3A200%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2217a605eb2940224%22%2C%22banner%22%3A%7B%22w%22%3A120%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2218b697da7795f18%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%2219978be50e33b86%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%2220ab1d031402598%22%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%222138473609a39ce%22%2C%22banner%22%3A%7B%22w%22%3A728%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%7D%2C%22ext%22%3A%7B%22source%22%3A%22prebid%22%7D%7D&ac=j&sd=1&
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.21 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-21.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cc21404b92f2dd70ad4050ca90e805bb4dfd8bf757dc4b978dc36e02230ae776

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Content-Encoding
gzip
Server
Apache
Vary
Accept-Encoding
P3p
policyref="/w3c/p3p.xml", CP="NOI DSP COR DEVa TAIa OUR BUS UNI"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
max-age=0, no-cache, no-store
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json
Content-Length
45
Expires
Mon, 07 Oct 2019 02:05:42 GMT
v1
dmx.districtm.io/b/
0
415 B
XHR
General
Full URL
https://dmx.districtm.io/b/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.16.68.69 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/json

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
cf-cache-status
DYNAMIC
server
cloudflare
status
204
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
origin
access-control-allow-methods
OPTIONS, POST
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
strict-transport-security
max-age=31536000; includeSubDomains; preload
cf-ray
521c4fc47b62c281-FRA
access-control-allow-headers
origin, content-type
ADTECH;apid=1Af77124d4-e8a6-11e9-8592-0251fbe596fc;cfp=1;rndc=1570413941;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1570413942336
adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/
Redirect Chain
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1570413942336;
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1570413942336
  • https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6658212/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1570413942336
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;apid=1Af77124d4-e8a6-11e9-8592-0251fbe596fc;cfp=1;rndc=1570413941;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1570413942336
48 B
81 B
XHR
General
Full URL
https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;apid=1Af77124d4-e8a6-11e9-8592-0251fbe596fc;cfp=1;rndc=1570413941;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1570413942336
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
152.199.22.2 , United States, ASN15133 (EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
Reverse DNS
Software
Adtech Adserver /
Resource Hash
f210b9271768b879d492cc109b80efe874a3fe26d74ea0d46c072713e839b03d

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
server
Adtech Adserver
status
200
access-control-allow-methods
POST,GET,HEAD,OPTIONS
content-type
application/json
access-control-allow-origin
null
cache-control
no-store, no-cache
access-control-allow-credentials
true
content-length
48
expires
Mon, 15 Jun 1998 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
server
nginx
status
302
location
https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;apid=1Af77124d4-e8a6-11e9-8592-0251fbe596fc;cfp=1;rndc=1570413941;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1570413942336
access-control-allow-methods
POST,GET,HEAD,OPTIONS
p3p
CP="NOI DSP DEVa OUR BUS UNI COM NAV INT"
access-control-allow-origin
null
cache-control
no-store, no-cache
access-control-allow-credentials
true
content-length
0
expires
Mon, 15 Jun 1998 00:00:00 GMT
ADTECH;apid=1Af772beb6-e8a6-11e9-b479-02d96b951e4e;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1570413942336
adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/
Redirect Chain
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1570413942336;
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1570413942336
  • https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6670994/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=1;rndc=1570413941;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1570413942336
  • https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6670994/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=2;rndc=1570413941;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1570413942336
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;apid=1Af772beb6-e8a6-11e9-b479-02d96b951e4e;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1570413942336
48 B
81 B
XHR
General
Full URL
https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;apid=1Af772beb6-e8a6-11e9-b479-02d96b951e4e;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1570413942336
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
152.199.22.2 , United States, ASN15133 (EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
Reverse DNS
Software
Adtech Adserver /
Resource Hash
723f8c921ee466a6016d6d75249bb18a558e18860931d094e5dd88bca235af95

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
server
Adtech Adserver
status
200
access-control-allow-methods
POST,GET,HEAD,OPTIONS
content-type
application/json
access-control-allow-origin
null
cache-control
no-store, no-cache
access-control-allow-credentials
true
content-length
48
expires
Mon, 15 Jun 1998 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
server
nginx
status
302
location
https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;apid=1Af772beb6-e8a6-11e9-b479-02d96b951e4e;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1570413942336
access-control-allow-methods
POST,GET,HEAD,OPTIONS
p3p
CP="NOI DSP DEVa OUR BUS UNI COM NAV INT"
access-control-allow-origin
null
cache-control
no-store, no-cache
access-control-allow-credentials
true
content-length
0
expires
Mon, 15 Jun 1998 00:00:00 GMT
ADTECH;apid=1Af77062a6-e8a6-11e9-9cb3-02d013b6d92e;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1570413942336
adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/
Redirect Chain
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1570413942336;
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;cfp=1;rndc=1570413941;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1570413942336
  • https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6669693/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1570413942336
  • https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;apid=1Af77062a6-e8a6-11e9-9cb3-02d013b6d92e;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1570413942336
47 B
266 B
XHR
General
Full URL
https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;apid=1Af77062a6-e8a6-11e9-9cb3-02d013b6d92e;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1570413942336
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
152.199.22.2 , United States, ASN15133 (EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
Reverse DNS
Software
Adtech Adserver /
Resource Hash
d29049a4ef5dd2e01d52b60293ce4254a76dbadc08ebd3486124e96ddb1e7d10

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
server
Adtech Adserver
status
200
access-control-allow-methods
POST,GET,HEAD,OPTIONS
p3p
CP="NOI DSP DEVa OUR BUS UNI COM NAV INT"
access-control-allow-origin
null
cache-control
no-store, no-cache
access-control-allow-credentials
true
content-type
application/json
content-length
47
expires
Mon, 15 Jun 1998 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
server
nginx
status
302
location
https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;apid=1Af77062a6-e8a6-11e9-9cb3-02d013b6d92e;cfp=1;rndc=1570413942;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1570413942336
access-control-allow-methods
POST,GET,HEAD,OPTIONS
p3p
CP="NOI DSP DEVa OUR BUS UNI COM NAV INT"
access-control-allow-origin
null
cache-control
no-store, no-cache
access-control-allow-credentials
true
content-length
0
expires
Mon, 15 Jun 1998 00:00:00 GMT
arj
yieldlove-d.openx.net/w/1.0/
4 KB
4 KB
XHR
General
Full URL
https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-120&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=2e0bb4ff-7ed5-4da1-b71b-648350d8b539%2C8acbdea5-133f-47f5-ba8b-d6aada0e744c%2C5e8aad86-3915-4835-bf37-89b5ee2debde&nocache=1570413942337&aus=300x250%7C300x600%2C160x600%2C200x600%2C120x600%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle%2Csky%2Cbanner&auid=539390940%2C540714782%2C540847469&
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.163.0 /
Resource Hash
bf50c2e20a0d392c8869a2f047c7c2ecacbc67c27c7fb88e64cfeb5f3988b677

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 google
server
OXGW/16.163.0
status
200
vary
Accept
p3p
CP="CUR ADM OUR NOR STA NID"
access-control-allow-origin
https://www.giga.de
cache-control
private, max-age=0, no-cache
access-control-allow-credentials
true
content-type
application/json
alt-svc
clear
content-length
4068
expires
Mon, 26 Jul 1997 05:00:00 GMT
bid
orbidder.otto.de/
0
145 B
XHR
General
Full URL
https://orbidder.otto.de/bid
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_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
date
Mon, 07 Oct 2019 02:05:42 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.giga.de
strict-transport-security
max-age=15724800; includeSubDomains
bid
orbidder.otto.de/
0
144 B
XHR
General
Full URL
https://orbidder.otto.de/bid
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_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
date
Mon, 07 Oct 2019 02:05:42 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.giga.de
strict-transport-security
max-age=15724800; includeSubDomains
bid
orbidder.otto.de/
0
144 B
XHR
General
Full URL
https://orbidder.otto.de/bid
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_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
date
Mon, 07 Oct 2019 02:05:42 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.giga.de
strict-transport-security
max-age=15724800; includeSubDomains
prebid
ib.adnxs.com/ut/v3/
1 KB
2 KB
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
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_ECDSA, AES_128_GCM
Server
37.252.173.22 , Ascension Island, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
536.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
62c1ac325eb3e990344d5db97c6dfee86c08f386bdf77cd6e29be7b9fe9d9d52
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Date
Mon, 07 Oct 2019 02:05:44 GMT
Content-Encoding
gzip
Transfer-Encoding
chunked
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Connection
keep-alive
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 536.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.173.45:80
X-XSS-Protection
0
Pragma
no-cache
AN-X-Request-Uuid
1fbccc19-4034-446d-81b0-07d3e8c6f671
Server
nginx/1.13.4
Vary
Accept-Encoding
Content-Type
application/json; charset=utf-8
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Expires
Sat, 15 Nov 2008 16:00:00 GMT
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.138.16 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
X-SMRT-D
4%3b2%3b106
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.138.16 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:41 GMT
X-SMRT-D
4%3b26%3b94
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.138.16 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
X-SMRT-D
4%3b13%3b41
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
fastlane.json
fastlane.rubiconproject.com/a/api/
240 B
2 KB
XHR
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=2e0bb4ff-7ed5-4da1-b71b-648350d8b539&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.6491497681273952
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 - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
c836e8ab799c688b37c2859736c124c94f454c530a13bc0edf533f38c0ec1836

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
RAS 2.4
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=498
Content-Length
240
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
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=8acbdea5-133f-47f5-ba8b-d6aada0e744c&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.5556409634170885
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 - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
ead2cb7bde057b6958215713b2b00fa14c3d7a0f56dada1001b7ce3fc1bcbe0c

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
RAS 2.4
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=495
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
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=5e8aad86-3915-4835-bf37-89b5ee2debde&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.7920026643267482
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 - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
7bb26081338c7d955ee50e9699beec73ddd139fc805b3e37385462cc8230d45d

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
RAS 2.4
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=498
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
config.js
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
51 KB
13 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
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.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
c670a9e8979d6b0470379251d189aad21d88e7c8cc84dbea372406ee686e3002

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:42 GMT
Content-Encoding
gzip
Age
1926
X-Cache
HIT
Connection
keep-alive
Content-Length
12204
x-amz-id-2
7YVGWPSyxzYJ+FCgfjz2jLwN9VZovZ6XJ7Fob8ROkSuRxTWrsonrU2edlF0HKdBRpvr5cBf10hs=
X-Served-By
cache-fra19152-FRA
Last-Modified
Mon, 07 Oct 2019 00:20:31 GMT
Server
AmazonS3
X-Timer
S1570413942.368004,VS0,VE0
ETag
"73a0d5804a17f135f05cf3b432a599c5"
x-amz-request-id
CF9AC68CCA19857B
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
340
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/ Frame 92E8
30 KB
30 KB
Image
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

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 09 Sep 2019 04:01:55 GMT
x-content-type-options
nosniff
age
2412227
filer-source
ce88ec61ef2b0ae3c6dce1f364e04b3dccdbf411589c67a9af3271f22f2780da
x-cache
HIT
status
200
accept-language
bytes
content-length
30682
x-xss-protection
1; mode=block
last-modified
Sat, 24 Aug 2019 05:59:04 GMT
server
nginx/1.10.3
filer-attr
W1s2NTAsMzY2XSwic3RpLXYzIixbIkZSQS0xIl0sWyJGUkItMSJdXQ==
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 23 Sep 2019 05:59:04 GMT
json
trc.taboola.com/stroeer-smb-giga/trc/3/
11 KB
5 KB
Script
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=04%3A05%3A42.399&lti=deflated&data=%7B%22id%22%3A578%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%3A1570413942394%2C%22cv%22%3A%2220191002-10-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%22cmps%22%3A3%2C%22btv%22%3A%220%22%2C%22cos%22%3A%224g%22%2C%22bad%22%3A-1%2C%22sw%22%3A1600%2C%22sh%22%3A1200%2C%22bw%22%3A1600%2C%22sde%22%3A%221.000%22%2C%22bh%22%3A1200%2C%22dw%22%3A1585%2C%22dh%22%3A5077%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%3A3738.296875%2C%22mw%22%3A625%7D%5D%2C%22cb%22%3A%22TRC.callbacks.recommendations_1%22%2C%22lt%22%3A%22deflated%22%7D
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191002-10-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
b9313be10da5b66d758407a657afbb63ecb3889109579e2360b8d6ec47022777

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
server
nginx
x-timer
S1570413942.405492,VS0,VE93
status
200
x-served-by
cache-hhn4030-HHN
vary
Accept-Encoding
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
access-control-allow-origin
*
access-control-allow-credentials
true
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
via
1.1 varnish
x-cache-hits
0
b2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1570413942403&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps...
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1570413942403&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapp...
0
248 B
Image
General
Full URL
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1570413942403&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.214.103 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-214-103.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT

Redirect headers

Location
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1570413942403&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=374764461&t=event&ni=1&_s=11&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=176875%20--%20so-funktioniert-paypal-hd.mp4%5Bvideojs%2F7.6.0%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=1229370929.1570413942&tid=UA-204785-4&_gid=161904196.1570413942&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.0&cd44=1&cm1=1&z=300916713
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:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 23 Aug 2019 03:46:39 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3881943
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
a831906d-7e93-4f8b-9b1c-96e8a57d3dc7
https://videos.giga.de/ Frame 92E8
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/a831906d-7e93-4f8b-9b1c-96e8a57d3dc7
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d

Request headers

Sec-Fetch-Mode
same-origin
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Length
31
Content-Type
application/javascript
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 92E8
53 B
642 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
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 - Amazon.com, Inc., US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:43 GMT
Last-Modified
Sun, 06 Oct 2019 15:34:32 GMT
Server
AmazonS3
x-amz-request-id
BED1A043A84CA038
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
PsZ3rhO6Y9UeVa4cL+s7Zt09HhHWRknTBdC3g8mS/Yua9Ak3xvO85EGaJlpFY983L3ES/vD8kL4=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 92E8
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
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

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
W/"5d1db79a-109"
status
200
access-control-allow-methods
GET
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=900
access-control-allow-headers
accept, content-type
expires
Mon, 07 Oct 2019 02:20:42 GMT
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201910021241/
26 KB
10 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201910021241/wrap.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
2781ecf5c51fdc9300e6859e23f72b013b66bae2987f54b8c216f2f04f24a757

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:42 GMT
Content-Encoding
gzip
Age
630
X-Cache
HIT
Connection
keep-alive
Content-Length
10113
x-amz-id-2
fwBxKCM2vw/l5vfpVDr92gkf8S7JcTvsB5PZ1DJVinDEk+o1VazBDoMvs4Tv7Z3zUoQrxTIoS4o=
X-Served-By
cache-fra19152-FRA
Last-Modified
Wed, 02 Oct 2019 22:17:29 GMT
Server
AmazonS3
X-Timer
S1570413942.436031,VS0,VE0
ETag
"9dd4ccae3554b07675d732dd4b644f80"
x-amz-request-id
D6079F1703034A42
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
65
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/ Frame EABD
Redirect Chain
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstTTHB1CX-2HAe6Wfr17oWiXDwzyVdNYWETOCMQnkYIoQXzGXh1izPDMcJpvZzZYhH2sTUoWmfEbI_zWHSfceOJO8CpYvlkxLKF9TRsW8Pd8D1w1uU-94aj6UknWmHT1gnknnDGcsM8U...
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
49 B
343 B
Image
General
Full URL
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:18a::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
last-modified
Wed, 29 Nov 2006 13:15:04 GMT
server
Apache
status
200
etag
"3260aadd174a1ebd50d0bd967c8fadea:1538746302"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
image/gif
access-control-allow-origin
*
cache-control
max-age=276961
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
49
expires
Thu, 10 Oct 2019 07:01:43 GMT

Redirect headers

timing-allow-origin
*
date
Mon, 07 Oct 2019 02:05:42 GMT
x-content-type-options
nosniff
server
cafe
status
302
location
//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
text/html; charset=UTF-8
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
ads
securepubads.g.doubleclick.net/gampad/
15 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2326595187208601&correlator=4370512350110007&output=ldjh&callback=googletag.impl.pubads.callbackProxy3&impl=fif&adsid=NT&eid=21064579%2C21064366%2C21064581%2C21064687&vrg=2019093001&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191007&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C468x60%7C728x180%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A20918.default%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D7%26smb-hour%3D4%26yt%3D0%26adset%3Dbrsl%26mbrid%3Df6a5f661ec1b9b0662b946c7bcdf53f3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound%26nuggad%3Dn127-1%252Cn121-1%252Cn126-1%252Cn69-0%252Cn75-1%252Cn91-1%252Cn62-1%252Cn116-0%252Cn158-1%252Cn104-1%252Cn139-1%252Cn128-1%252Cn5-4%252Cn48-1%252Cn109-0%252Cn105-0%252Cn159-0%252Cn114-1%252Cn20-1%252Cn80-1%252Cn117-4%252Cn123-2%252Cn90-1%252Cn76-0%252Cn66-1%252Cn101-0%252Cn77-0%252Cn60-1%252Cn64-0%252Cn111-0%252Cn136-0%252Cn103-0%252Cn17-1%252Cn137-0%252Cn161-0%252Cn86-0%252Cn147-4%252Cn3-1%252Cn83-1%252Cn8-3%252Cn107-1%252Cn47-1%252Cn99-0%252Cn120-3%252Cn118-3%252Cn133-1%252Cn153-0%252Cn22-1%252Cn82-0%252Cn156-1%252Cn124-0%252Cn138-0%252Cn140-0%252Cn141-0%252Cn157-0%252Cn142-0%252Cn7-2%252Cn110-1%252Cn87-0%252Cn12-1%252Cn102-0%252Cn92-3%252Cn122-1%252Cn27-2%252Cn11-2%252Cn46-1%252Cn79-1%252Cn93-4%252Cn148-1%252Cn2-3%252Cn67-0%252Cn115-1%252Cn89-1%252Cn49-2%252Cn154-0%252Cn84-0%252Cn108-1%252Cn54-1%252Cn18-1%252Cn135-4%252Cn88-1%252Cn160-0%252Cn78-0%252Cn44-1%252Cn106-0%252Cn119-6%252Cn81-1%252Cn125-1%252Cn24-2%252Cn149-0%252Cn85-0%252Cn9-3%252Cn10-2%252Cn21-1%252Cn15-1%252Cn155-1%252Cn6-2%252Cn63-0%252Cn94-2&cookie=ID%3Ddc9acb179122b358%3AT%3D1570413942%3AS%3DALNI_MYxcXSDdU2jrTsqv42VSN_UdI29FQ&cookie_enabled=1&bc=31&abxe=1&lmt=1570413942&dt=1570413942471&dlt=1570413941787&idt=389&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3040188762&uci=3&ifi=4&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=70&icsg=213992717978632&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&psts=CicIxKKv2RDoAfyQ0vKCBIICDN_RiQ3P9sYVr47MFdECwbw7FGH9IYw&ga_vid=1229370929.1570413942&ga_sid=1570413942&ga_hid=374764461&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_2019093001.js?21064579
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
141d3097b12df4553fb3cc1bd69ab02a93b3dd12c269ea5bebd48ae96dffa8b8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
4605
x-xss-protection
0
google-lineitem-id
5189757313
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138289836644
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
8 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2326595187208601&correlator=4370512350110007&output=ldjh&callback=googletag.impl.pubads.callbackProxy4&impl=fif&adsid=NT&eid=21064579%2C21064366%2C21064581%2C21064687&vrg=2019093001&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191007&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x40%7C10x30%7C10x20%7C500x600%7C770x200%7C120x600%7C160x600%7C200x600%7C300x600&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A19051.default%26yieldlove_meta%3Dpid%253A19051.sb%253Af%26yieldlove_pid%3D19051%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D7%26smb-hour%3D4%26yt%3D0%26adset%3Dbrsl%26mbrid%3Df6a5f661ec1b9b0662b946c7bcdf53f3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound%26nuggad%3Dn127-1%252Cn121-1%252Cn126-1%252Cn69-0%252Cn75-1%252Cn91-1%252Cn62-1%252Cn116-0%252Cn158-1%252Cn104-1%252Cn139-1%252Cn128-1%252Cn5-4%252Cn48-1%252Cn109-0%252Cn105-0%252Cn159-0%252Cn114-1%252Cn20-1%252Cn80-1%252Cn117-4%252Cn123-2%252Cn90-1%252Cn76-0%252Cn66-1%252Cn101-0%252Cn77-0%252Cn60-1%252Cn64-0%252Cn111-0%252Cn136-0%252Cn103-0%252Cn17-1%252Cn137-0%252Cn161-0%252Cn86-0%252Cn147-4%252Cn3-1%252Cn83-1%252Cn8-3%252Cn107-1%252Cn47-1%252Cn99-0%252Cn120-3%252Cn118-3%252Cn133-1%252Cn153-0%252Cn22-1%252Cn82-0%252Cn156-1%252Cn124-0%252Cn138-0%252Cn140-0%252Cn141-0%252Cn157-0%252Cn142-0%252Cn7-2%252Cn110-1%252Cn87-0%252Cn12-1%252Cn102-0%252Cn92-3%252Cn122-1%252Cn27-2%252Cn11-2%252Cn46-1%252Cn79-1%252Cn93-4%252Cn148-1%252Cn2-3%252Cn67-0%252Cn115-1%252Cn89-1%252Cn49-2%252Cn154-0%252Cn84-0%252Cn108-1%252Cn54-1%252Cn18-1%252Cn135-4%252Cn88-1%252Cn160-0%252Cn78-0%252Cn44-1%252Cn106-0%252Cn119-6%252Cn81-1%252Cn125-1%252Cn24-2%252Cn149-0%252Cn85-0%252Cn9-3%252Cn10-2%252Cn21-1%252Cn15-1%252Cn155-1%252Cn6-2%252Cn63-0%252Cn94-2&cookie=ID%3Ddc9acb179122b358%3AT%3D1570413942%3AS%3DALNI_MYxcXSDdU2jrTsqv42VSN_UdI29FQ&cookie_enabled=1&bc=31&abxe=1&lmt=1570413942&dt=1570413942476&dlt=1570413941787&idt=389&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2089391793&uci=4&ifi=5&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=70&icsg=213992717978632&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&psts=CicIxKKv2RDoAfyQ0vKCBIICDN_RiQ3P9sYVr47MFdECwbw7FGH9IYw&ga_vid=1229370929.1570413942&ga_sid=1570413942&ga_hid=374764461&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_2019093001.js?21064579
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
3324b91c39d6416dd224d4cbc6334c81db1da0e210fcbe1887208270c7df2771
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3512
x-xss-protection
0
google-lineitem-id
5189757313
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138289836647
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
8 KB
3 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2326595187208601&correlator=4370512350110007&output=ldjh&callback=googletag.impl.pubads.callbackProxy5&impl=fif&adsid=NT&eid=21064579%2C21064366%2C21064581%2C21064687&vrg=2019093001&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191007&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A9501.default%26yieldlove_meta%3Dpid%253A9501.sb%253Af%26yieldlove_pid%3D9501%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D7%26smb-hour%3D4%26yt%3D0%26adset%3Dbrsl%26mbrid%3Df6a5f661ec1b9b0662b946c7bcdf53f3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound%26nuggad%3Dn127-1%252Cn121-1%252Cn126-1%252Cn69-0%252Cn75-1%252Cn91-1%252Cn62-1%252Cn116-0%252Cn158-1%252Cn104-1%252Cn139-1%252Cn128-1%252Cn5-4%252Cn48-1%252Cn109-0%252Cn105-0%252Cn159-0%252Cn114-1%252Cn20-1%252Cn80-1%252Cn117-4%252Cn123-2%252Cn90-1%252Cn76-0%252Cn66-1%252Cn101-0%252Cn77-0%252Cn60-1%252Cn64-0%252Cn111-0%252Cn136-0%252Cn103-0%252Cn17-1%252Cn137-0%252Cn161-0%252Cn86-0%252Cn147-4%252Cn3-1%252Cn83-1%252Cn8-3%252Cn107-1%252Cn47-1%252Cn99-0%252Cn120-3%252Cn118-3%252Cn133-1%252Cn153-0%252Cn22-1%252Cn82-0%252Cn156-1%252Cn124-0%252Cn138-0%252Cn140-0%252Cn141-0%252Cn157-0%252Cn142-0%252Cn7-2%252Cn110-1%252Cn87-0%252Cn12-1%252Cn102-0%252Cn92-3%252Cn122-1%252Cn27-2%252Cn11-2%252Cn46-1%252Cn79-1%252Cn93-4%252Cn148-1%252Cn2-3%252Cn67-0%252Cn115-1%252Cn89-1%252Cn49-2%252Cn154-0%252Cn84-0%252Cn108-1%252Cn54-1%252Cn18-1%252Cn135-4%252Cn88-1%252Cn160-0%252Cn78-0%252Cn44-1%252Cn106-0%252Cn119-6%252Cn81-1%252Cn125-1%252Cn24-2%252Cn149-0%252Cn85-0%252Cn9-3%252Cn10-2%252Cn21-1%252Cn15-1%252Cn155-1%252Cn6-2%252Cn63-0%252Cn94-2&cookie=ID%3Ddc9acb179122b358%3AT%3D1570413942%3AS%3DALNI_MYxcXSDdU2jrTsqv42VSN_UdI29FQ&cookie_enabled=1&bc=31&abxe=1&lmt=1570413942&dt=1570413942482&dlt=1570413941787&idt=389&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3694558186&uci=5&ifi=6&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=70&icsg=213992717978632&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&psts=CicIxKKv2RDoAfyQ0vKCBIICDN_RiQ3P9sYVr47MFdECwbw7FGH9IYw&ga_vid=1229370929.1570413942&ga_sid=1570413942&ga_hid=374764461&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_2019093001.js?21064579
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
54eec5ed620afaf557024bc80f5fc58c0ffa5777a8a6cf77566da8d811ca4818
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3409
x-xss-protection
0
google-lineitem-id
5180893370
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138288805185
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
Cookie set /
d.agkn.com/iframe/8613/ Frame 96BB
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=643541859&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Requested by
Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.121.36.175 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-121-36-175.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
d.agkn.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Cache-Control
no-cache, must-revalidate
Content-Type
text/html;charset=UTF-8
Date
Mon, 07 Oct 2019 02:05:42 GMT
Expires
Sat, 01 Jan 2000 00:00:00 GMT
P3P
CP="NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Pragma
no-cache
Server
Apache-Coyote/1.1
Set-Cookie
ab=0001%3ALFJZIAOD%2FCQfAOwmm%2FzzLUxpMTe0sJzq;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAlLVn2JS1Z9gAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
Content-Length
482
Connection
keep-alive
container
tracking.m6r.eu/pixel/
0
376 B
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=1&n126=1&n69=0&n75=1&n91=1&n62=1&n116=0&n158=1&n104=1&n139=1&n128=1&n5=4&n48=1&n109=0&n105=0&n159=0&n114=1&n20=1&n80=1&n117=4&n123=2&n90=1&n76=0&n66=1&n101=0&n77=0&n60=1&n64=0&n111=0&n136=0&n103=0&n17=1&n137=0&n161=0&n86=0&n147=4&n3=1&n83=1&n8=3&n107=1&n47=1&n99=0&n120=3&n118=3&n133=1&n153=0&n22=1&n82=0&n156=1&n124=0&n138=0&n140=0&n141=0&n157=0&n142=0&n7=2&n110=1&n87=0&n12=1&n102=0&n92=3&n122=1&n27=2&n11=2&n46=1&n79=1&n93=4&n148=1&n2=3&n67=0&n115=1&n89=1&n49=2&n154=0&n84=0&n108=1&n54=1&n18=1&n135=4&n88=1&n160=0&n78=0&n44=1&n106=0&n119=6&n81=1&n125=1&n24=2&n149=0&n85=0&n9=3&n10=2&n21=1&n15=1&n155=1&n6=2&n63=0&n94=2
Requested by
Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:42 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
0
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 92E8
653 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.127 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-127.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:04:50 GMT
Via
1.1 42b60ee17f7593fff72ca1cb725d6c9a.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
53
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:47 GMT
Server
AmazonS3
ETag
"063da71572f57793ea4125f50b418f84"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
X-Amz-Cf-Pop
FRA2-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
CUfmQlknIpLubDxvRzD5IydIYvac_UNiQbSwtbRa9Y7ALBgxjKYe8A==
Expires
0
view
securepubads.g.doubleclick.net/pcs/ Frame 2DC8
0
65 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssaZoi-yoQElVMZsMfwRpQt1gaXPxfeRmYeaG5CX5_jnZki5691tANm8z1_JkcVC_bLjqesoUTPunraL7M3KOqzQYWv0uXOh_wYHRxtJm_XnG1F-B4cUtuy2zfDDWwijB1FvFrRoeAuGlzRSjXHB5iPYABW7BBBXEGWzvbZ9Kh-dS5YHNp8kIBp2Ejc0LsVC-XIJ-dsXrYfeX4V0lDejiX5ic9_WaeHonqWezfTMWzIMDQ7alaYnFRCLHzFI_vRaU6UeJmKjGqgmE7xluBTuan-Kw&sig=Cg0ArKJSzP2xM2qSZjLLEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Mon, 07 Oct 2019 02:05:42 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
video.php
media.oadts.com/www/delivery/ Frame 2DC8
108 KB
108 KB
Script
General
Full URL
https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=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, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
5dbbdc8fcb6ffca57165278f6620f2587433608ff9b0fe88c646a8421b6f010d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Cache-Control
private, max-age=0, no-cache
Server
lighttpd/1.4.45
Content-type
text/javascript; charset=UTF-8
Content-Length
110291
Expires
Mon, 26 Jul 1997 05:00:00 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 2DC8
78 KB
29 KB
Script
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_modern_rendering_2019093001.js?21064579
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
b55f0e65314298aa6644034ba593878fdaa54d2110c57c35857a46fa54361fab
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570187668844456"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29696
x-xss-protection
0
expires
Mon, 07 Oct 2019 02:05:42 GMT
/
d.nativendo.de/cds/delivery/get/
9 KB
2 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/get/?url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1170
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
0e48469ab130cace92f9adc56bd1e4179e7f6ac6c35f1b685444c3eee1e78645

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
last-modified
Mon, 07 Oct 2019 02:05:42 GMT
server
Apache
vary
Accept-Encoding
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
1853
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
tb
15.taboola.com/
30 KB
30 KB
Script
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=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&variant=-100|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1570413942517&tagid=&cntry=DE&platform=1&sesid=298fd65633398513ec2b5fc66dc1b986&itemid=/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme&viewid=1570413942394&geolat=&geoing=&deviceifa=&appid=&sd=v2_298fd65633398513ec2b5fc66dc1b986_cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6_1570413942_1570413942_CNawjgYQrMVBGPqs3J_aLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA&ri=9210a59597813535213438dcadb24b03&appname=&cdb=&gdprApplies=&rid=&sii=333075201540415599
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191002-10-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
2bae0748e26a313aa1aec60fd0d907e4c974a1e5e38c120401c836534771dd6f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570413943.541148,VS0,VE14
machineid
1417
x-cache
MISS
content-type
text/html;charset=ISO-8859-1
status
200
expires
Sat, 26 Jul 1997 05:00:00 GMT
cache-control
no-cache,must-revalidate,no-store,max-age=0,s-maxage=0
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-fra19150-FRA
feed-card-placeholder.20191002-10-RELEASE.es6.js
cdn.taboola.com/libtrc/
5 KB
2 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/feed-card-placeholder.20191002-10-RELEASE.es6.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
a3e244d62127c387d1fc002134fa39bc19254d9dc23e718741febe8205554f13

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
JTxC4aocqzySQUrVpaek27G1.B4tjQtq
content-encoding
gzip
etag
"251d16cabd8a844bfff583dede124640"
age
108
x-cache
HIT
status
200
x-amz-replication-status
PENDING
content-length
1288
x-amz-id-2
wkf4m87WfU2pKUfrHItrJygabdkHdYvAfDKLh6FZJhYPHYbiWVrIPAm4pbVXO6Nsl7qZ0mwom+U=
x-served-by
cache-hhn4030-HHN
last-modified
Wed, 02 Oct 2019 22:32:38 GMT
server
AmazonS3
x-timer
S1570413943.521565,VS0,VE0
date
Mon, 07 Oct 2019 02:05:42 GMT
vary
Accept-Encoding
x-amz-request-id
761693CCB36499BD
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
6
x-cache-hits
63
f89e1763-220d-4e09-ba69-9e040548fb7a.svg
cdn.taboola.com/static/f8/
4 KB
2 KB
Image
General
Full URL
https://cdn.taboola.com/static/f8/f89e1763-220d-4e09-ba69-9e040548fb7a.svg
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191002-10-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
cMrDKn.emLmm9kiiOOF64ulDT4DRy6LK
content-encoding
gzip
etag
"b8b410e4b18d45aa2f3d9bc09cd335fb"
age
16
via
1.1 varnish
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
1758
x-amz-id-2
LBcEGqARPtb+VMcxyHKLfPRUiFY298K/OcQaUtL8jVoATwJPJ2k7oYgpfGsKlddPOv6r2Pcl4es=
x-served-by
cache-hhn4030-HHN
last-modified
Wed, 07 Feb 2018 11:15:52 GMT
server
AmazonS3
x-timer
S1570413943.524287,VS0,VE0
date
Mon, 07 Oct 2019 02:05:42 GMT
vary
Accept-Encoding
access-control-allow-methods
GET
x-amz-request-id
5BA3698765B9B0CA
access-control-allow-origin
*
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/svg+xml
access-control-allow-headers
*
abp
6
x-cache-hits
7
userx.20191002-10-RELEASE.es6.js
cdn.taboola.com/libtrc/
22 KB
8 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/userx.20191002-10-RELEASE.es6.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
e85ba4d66717e8de5dcba1b5e0285ced20874b84f316ff3c0840277352b9c9ea

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
7czDtX8TJp.OUfK2QYR9kQhkSDorEoft
content-encoding
gzip
etag
"68efda98343f3a646119692abafb484d"
age
86
x-cache
HIT
status
200
x-amz-replication-status
PENDING
content-length
7734
x-amz-id-2
QPd6mBrMe7OS2Q0zCsGsUkKeOz9Fp/l+LNeHi9xyDpuo955im+Taey5jlU5+sdQU3GQtF/V4yz8=
x-served-by
cache-hhn4030-HHN
last-modified
Wed, 02 Oct 2019 22:32:45 GMT
server
AmazonS3
x-timer
S1570413943.531774,VS0,VE0
date
Mon, 07 Oct 2019 02:05:42 GMT
vary
Accept-Encoding
x-amz-request-id
0C72CF643987F764
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
6
x-cache-hits
28
rtb-h
trc.taboola.com/sg/mediaforcebidder-network/1/ Frame 17C9
Redirect Chain
  • https://rtb.mfadsrvr.com/sync?ssp=taboola
  • https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
  • https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=f0f7c4cd-14aa-4b2a-99dc-ae0e8a13817b
0
49 B
Image
General
Full URL
https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=f0f7c4cd-14aa-4b2a-99dc-ae0e8a13817b
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
server
nginx
x-timer
S1570413943.625170,VS0,VE8
x-cache
MISS
status
204
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-hhn4030-HHN

Redirect headers

Location
//trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=f0f7c4cd-14aa-4b2a-99dc-ae0e8a13817b
Date
Mon, 07 Oct 2019 02:05:42 GMT
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
P3P
CP="NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA"
/
trc.taboola.com/sg/rubicon-network-display/1/rtb-h/ Frame 17C9
Redirect Chain
  • https://pixel.rubiconproject.com/exchange/sync.php?p=16698
  • https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
0
0
Image
General
Full URL
https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Redirect headers

Pragma
no-cache
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Location
https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
Cache-Control
no-cache,no-store,must-revalidate
Content-Type
text/html
content-length
0
X-RPHost
78e3bdce5107450057bade54d54a0a7e
Expires
0
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/ Frame 17C9
Redirect Chain
  • https://px.powerlinks.com/user/identify?sourceId=d4a7a706-ab0f-11e8-a038-127202fb7690&rurl=https%3A%2F%2Ftrc.taboola.com%2Fsg%2Fpowerlinksdsp-network%2F1%2Frtb-h%2F%3Ftaboola_hm%3D%24%7BUSER%7D
  • https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=jIMVISTUgJuT_iWfIQO6sqUn-lnHmVLZ3KkSl4zpv38%3D
45 B
103 B
Image
General
Full URL
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=jIMVISTUgJuT_iWfIQO6sqUn-lnHmVLZ3KkSl4zpv38%3D
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
server
nginx
x-timer
S1570413943.606812,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-hhn4030-HHN

Redirect headers

Location
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=jIMVISTUgJuT_iWfIQO6sqUn-lnHmVLZ3KkSl4zpv38%3D
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
nginx
Connection
close
Etag
"jIMVISTUgJuT_iWfIQO6sqUn-lnHmVLZ3KkSl4zpv38="
Content-Length
0
rtb-h
match.taboola.com/sg/appnexus-network/1/ Frame 17C9
Redirect Chain
  • https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=$UID
  • https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=5753789694147878808
  • https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=5753789694147878808&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3D5753789694147878808
0
153 B
Image
General
Full URL
https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=5753789694147878808&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3D5753789694147878808
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570413943.616784,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4061-HHN

Redirect headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
server
nginx
x-timer
S1570413943.566410,VS0,VE8
x-served-by
cache-hhn4030-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=5753789694147878808&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3D5753789694147878808
accept-ranges
bytes
content-length
0
x-cache-hits
0
rtb-h
match.taboola.com/sg/google-network/1/ Frame 17C9
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=CAESEJdrx925eSGnIouS5MMOTeU&google_cver=1
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEJdrx925eSGnIouS5MMOTeU&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3DCAESEJdrx925eSGnIouS5MMOTeU%26goo...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEJdrx925eSGnIouS5MMOTeU&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3DCAESEJdrx925eSGnIouS5MMOTeU%26google_cver%3D1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570413943.622753,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4061-HHN

Redirect headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
server
nginx
x-timer
S1570413943.592801,VS0,VE8
x-served-by
cache-hhn4030-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEJdrx925eSGnIouS5MMOTeU&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3DCAESEJdrx925eSGnIouS5MMOTeU%26google_cver%3D1
accept-ranges
bytes
content-length
0
x-cache-hits
0
/
trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/ Frame 17C9
Redirect Chain
  • https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=$UID
  • https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=5753789694147878808
0
168 B
Image
General
Full URL
https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=5753789694147878808
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
server
nginx
x-timer
S1570413943.565718,VS0,VE8
x-cache
MISS
status
204
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-hhn4030-HHN

Redirect headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:44 GMT
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 536.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.173.51:80
AN-X-Request-Uuid
1e6058d2-5337-4092-9950-5df780e058e9
Server
nginx/1.13.4
Access-Control-Allow-Origin
*
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Location
https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=5753789694147878808
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
rtb-h
match.taboola.com/sg/thetradedesk-network/1/ Frame 17C9
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=a5969358-6387-4fe7-b1d5-f68c41be58c2
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=a5969358-6387-4fe7-b1d5-f68c41be58c2&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3Da5969358-6387-4fe7...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=a5969358-6387-4fe7-b1d5-f68c41be58c2&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3Da5969358-6387-4fe7-b1d5-f68c41be58c2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570413943.750755,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4061-HHN

Redirect headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
server
nginx
x-timer
S1570413943.709353,VS0,VE8
x-served-by
cache-hhn4030-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=a5969358-6387-4fe7-b1d5-f68c41be58c2&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3Da5969358-6387-4fe7-b1d5-f68c41be58c2
accept-ranges
bytes
content-length
0
x-cache-hits
0
rtb-h
match.taboola.com/sg/storygize-network/1/ Frame 17C9
Redirect Chain
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=61b9918d-43a9-43f7-9bdd-71fab3ed17c8
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=61b9918d-43a9-43f7-9bdd-71fab3ed17c8&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3D61b9918d-43a9-43f7-9b...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=61b9918d-43a9-43f7-9bdd-71fab3ed17c8&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3D61b9918d-43a9-43f7-9bdd-71fab3ed17c8
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:43 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570413943.250084,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4061-HHN

Redirect headers

date
Mon, 07 Oct 2019 02:05:43 GMT
via
1.1 varnish
server
nginx
x-timer
S1570413943.167359,VS0,VE8
x-served-by
cache-hhn4030-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=61b9918d-43a9-43f7-9bdd-71fab3ed17c8&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3D61b9918d-43a9-43f7-9bdd-71fab3ed17c8
accept-ranges
bytes
content-length
0
x-cache-hits
0
cookiesync
bttrack.com/pixel/ Frame 17C9
35 B
380 B
Image
General
Full URL
https://bttrack.com/pixel/cookiesync?source=14b8c562-d12b-418b-b680-ad517d5839ec
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_GCM
Server
192.132.33.46 , United States, ASN18568 (BIDTELLECT - Bidtellect Inc., US),
Reverse DNS
46.bidtellect.com
Software
Microsoft-IIS/8.5 /
Resource Hash
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992

Request headers

Sec-Fetch-Mode
no-cors
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

X-ServerName
Track003-dc3
Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
X-AspNetMvc-Version
5.2
Server
Microsoft-IIS/8.5
X-AspNet-Version
4.0.30319
P3P
CP="CAO DSP COR ADMo DEVo PSAo PSDo HISo IVAo IVDo OUR IND OTC"
Cache-Control
private,no-cache
Content-Type
image/gif
Content-Length
35
Expires
-1
/
cds.taboola.com/ Frame 17C9
0
292 B
Image
General
Full URL
https://cds.taboola.com/?uid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&_r=7493522
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_ECDSA, AES_256_GCM
Server
130.211.13.252 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
252.13.211.130.bc.googleusercontent.com
Software
nginx/1.12.2 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:42 GMT
Via
1.1 varnish
Server
nginx/1.12.2
X-Timer
S1570413943.798133,VS0,VE68
X-Served-By
cache-bwi5038-BWI
X-Cache
MISS
x-envoy-upstream-service-time
1
Connection
close
Accept-Ranges
bytes
Content-Length
0
X-Cache-Hits
0
rtb-h
match.taboola.com/sg/bidswitch-network/1/ Frame 17C9
Redirect Chain
  • https://x.bidswitch.net/sync?ssp=taboola
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola
  • https://p.rfihub.com/cm?in=1&pub=20513&ssp=taboola
  • https://x.bidswitch.net/sync?dsp_id=119&user_id=1041527795736575752&expires=30&ssp=taboola
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=45c3066d-0d0a-47c3-b958-7454d059a5f1
  • https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=45c3066d-0d0a-47c3-b958-7454d059a5f1&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3D45c3066d-0d0a-47c3-b9...
0
53 B
Image
General
Full URL
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=45c3066d-0d0a-47c3-b958-7454d059a5f1&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3D45c3066d-0d0a-47c3-b958-7454d059a5f1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570413943.765556,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4061-HHN

Redirect headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
server
nginx
x-timer
S1570413943.750868,VS0,VE8
x-served-by
cache-hhn4030-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=45c3066d-0d0a-47c3-b958-7454d059a5f1&tbid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&query=taboola_hm%3D45c3066d-0d0a-47c3-b958-7454d059a5f1
accept-ranges
bytes
content-length
0
x-cache-hits
0
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=374764461&t=event&ni=1&_s=12&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEADQ~&jid=&gjid=&cid=1229370929.1570413942&tid=UA-204785-4&_gid=161904196.1570413942&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cm73=1&cm13=1&z=650713369
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:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 23 Aug 2019 03:46:39 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3881943
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
297 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191002-10-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
server
nginx
x-timer
S1570413943.551152,VS0,VE8
x-served-by
cache-hhn4030-HHN
status
204
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
content-type
image/gif
x-cache-hits
0
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
54 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191002-10-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
server
nginx
x-timer
S1570413943.551429,VS0,VE8
x-served-by
cache-hhn4030-HHN
status
204
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
content-type
image/gif
x-cache-hits
0
le.php
media.oadts.com/www/delivery/ Frame 2DC8
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=9&cb=1083287873
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 2DC8
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=10&cb=38581449719
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 2DC8
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=11&cb=92880696698
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 68D0
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvbwEHzHHQ5P3zngJjp9HadxSuRPRP-ZT3MOjEeHGiUt0fciPDmUYxfoVmTnLgaBFfXl126vCyFjpwXtjp54UgVgsscLtt4UGEoxtlE3HsjJJeHhdTS-yb6FUcNi1akIpUf1rRLQ2O9zLdxSIdsB2YvfhYlPN3XSRBuCQ48NcjnKEWdifTXzYbMXGZBkFitXk52eOrvNYE3sHYFn8Y7OTgr2JQ7KtXuuffTjtqXkYopePUCHBopLPvgaHgKa8ub2bLkanl-heQuOWK85G-ECab_OuqWHdk-gsWwvaMB_hQV&sig=Cg0ArKJSzPXtEM-mIg2_EAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Mon, 07 Oct 2019 02:05:42 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
Cookie set banner
ad2.adfarm1.adition.com/ Frame FCF5
0
0
Document
General
Full URL
https://ad2.adfarm1.adition.com/banner?sid=3957066&ts=24599407&kid=3368837&bid=10459665&wpt=H&clickurl=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjssshs6TjhBzKIRhnJvC0pIzrFz2RYVI4GyJumEmWf7648HkvKeZx0_tMcVAFkLmFn0JSLN-y_6EeDwmJqIjaWZjDjrZa8UgDIZJ__pAhwBlhpqt49Un2q341b8H2gQLhhol2PC55LlY7nhvnrBtBgcsEk1bUa4ubKXw0KfJj3aC4K9Xa0cR_P4WJJDh4JNw8DZb2Au0ImNcOV3QbMEeFa1ioZifgzoKpE11g4YCYlgs12_RE3SzjzkuBQPh-tSu_SLWDLpHkRZEpyJepA&sig=Cg0ArKJSzKsgnrNrKPrZEAE&urlfix=1&adurl=
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
217.79.188.21 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
ad2.adfarm1.adition.com
Software
ADITIONSERVER v1.0 /
Resource Hash

Request headers

Host
ad2.adfarm1.adition.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Content-Type
text/html
Transfer-Encoding
chunked
Connection
keep-alive
Server
ADITIONSERVER v1.0
Date
Mon, 07 Oct 2019 04:05:42 +0200
Cache-Control
no-cache
Expires
Sat, 01 Jan 2000 00:00:00 GMT
P3P
policyref="https://imagesrv.adition.com/w3c/p3p-ssl.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
Pragma
no-cache
Set-Cookie
UserID1=6744876522074735830; expires=Sat, 04-Apr-2020 02:05:41 GMT; path=/; domain=.adfarm1.adition.com lv_3368837=w=3957066|t=1570413941; expires=Mon, 07-Oct-2019 02:35:41 GMT; path=/; domain=.adfarm1.adition.com
Content-Encoding
gzip
Cookie set banner
ad2.adfarm1.adition.com/ Frame 40D6
0
0
Document
General
Full URL
https://ad2.adfarm1.adition.com/banner?sid=3957067&ts=24599407&kid=3368837&bid=10459664&wpt=H&clickurl=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjssshs6TjhBzKIRhnJvC0pIzrFz2RYVI4GyJumEmWf7648HkvKeZx0_tMcVAFkLmFn0JSLN-y_6EeDwmJqIjaWZjDjrZa8UgDIZJ__pAhwBlhpqt49Un2q341b8H2gQLhhol2PC55LlY7nhvnrBtBgcsEk1bUa4ubKXw0KfJj3aC4K9Xa0cR_P4WJJDh4JNw8DZb2Au0ImNcOV3QbMEeFa1ioZifgzoKpE11g4YCYlgs12_RE3SzjzkuBQPh-tSu_SLWDLpHkRZEpyJepA&sig=Cg0ArKJSzKsgnrNrKPrZEAE&urlfix=1&adurl=
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
217.79.188.21 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
ad2.adfarm1.adition.com
Software
ADITIONSERVER v1.0 /
Resource Hash

Request headers

Host
ad2.adfarm1.adition.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Content-Type
text/html
Transfer-Encoding
chunked
Connection
keep-alive
Server
ADITIONSERVER v1.0
Date
Mon, 07 Oct 2019 04:05:42 +0200
Cache-Control
no-cache
Expires
Sat, 01 Jan 2000 00:00:00 GMT
P3P
policyref="https://imagesrv.adition.com/w3c/p3p-ssl.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
Pragma
no-cache
Set-Cookie
UserID1=6744876522074866902; expires=Sat, 04-Apr-2020 02:05:41 GMT; path=/; domain=.adfarm1.adition.com lv_3368837=w=3957067|t=1570413941; expires=Mon, 07-Oct-2019 02:35:41 GMT; path=/; domain=.adfarm1.adition.com
Content-Encoding
gzip
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 68D0
78 KB
29 KB
Script
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_modern_rendering_2019093001.js?21064579
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
b55f0e65314298aa6644034ba593878fdaa54d2110c57c35857a46fa54361fab
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570187668844456"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29696
x-xss-protection
0
expires
Mon, 07 Oct 2019 02:05:42 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 5A6B
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuoHAWhs0hCrbu7z4Ja4JtWejBGcRFMq0DxVhYKCLmUler4DF4ovfxqnO33JdkLCg4-mEEFDjaovbH7FOR7_hWMVQ6JTRlUgiCaMhLTeTJiaSkn_mZcornVkODlfWg3WXneckFddncoS36QFi9qwd4lrhbrcBN-0W1Hw7u6ewB08TcsvfdctJZIKubZdxaojOVKClWxrcBwUY2aFXBG7uW2vMSeg_QFVLL4cmJOqFS-hlfJtVXYJ762RJlLUE6qmj_G0co0RFh4zorIcRCOEXFDwFImQYhi9ptMVyzKXmBR&sig=Cg0ArKJSzELrHrfmK5KwEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Mon, 07 Oct 2019 02:05:42 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 5A6B
78 KB
29 KB
Script
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_modern_rendering_2019093001.js?21064579
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
b55f0e65314298aa6644034ba593878fdaa54d2110c57c35857a46fa54361fab
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570187668844456"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29696
x-xss-protection
0
expires
Mon, 07 Oct 2019 02:05:42 GMT
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame 92E8
205 KB
60 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=JXJimPdWNm
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.127 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-127.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
875015f6d262d1a35165fa89db1c0cfa60e4c8964934c1523586c6b73a54ac50

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:04:51 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
52
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Fri, 04 Oct 2019 12:14:57 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 42b60ee17f7593fff72ca1cb725d6c9a.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Pop
FRA2-C1
X-Amz-Cf-Id
pRIg7S_cqqvR6m-qT7U8vLbk4GJ763nLO7l7i2oL062e_woZ1kKEgA==
avc.php
media.oadts.com/www/delivery/ Frame 2DC8
12 KB
12 KB
XHR
General
Full URL
https://media.oadts.com/www/delivery/avc.php?zoneid=5074&pw=100%25&ph=100%25&msgId=atg9527437531&startmuted=1&cb=0.4903781075501874&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&autostart=1
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
1939dfe9d1326251c0ed05efa9f0a4331fe718e9c3c4bdb2d4070016ca1a06b8

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
lighttpd/1.4.45
Access-Control-Max-Age
86400
P3P
CP="CUR ADM OUR NOR STA NID"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
private, max-age=0, no-cache
Access-Control-Allow-Credentials
true
Content-type
application/json
Content-Length
11803
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 2DC8
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=12&cb=61272618467
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
254 B
713 B
Image
General
Full URL
https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
hL.cyLD7Q4TL5ceY.7JQwF9m5IYI8mkC
via
1.1 varnish
etag
"dfa7b52c86e56bd67fa4002f6ed19854"
age
9443
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
254
x-amz-id-2
grODyaFUyHwi27S6u2hd746yPHwUf+y1im5Wn93DxT7wozhn8KMFUP712WAAG3eD1t2rnF4k3Bs=
x-served-by
cache-hhn4030-HHN
last-modified
Wed, 24 Jun 2015 07:14:11 GMT
server
AmazonS3
x-amz-meta-s3cmd-attrs
uid:0/gname:root/uname:root/gid:0/mode:33188/mtime:1377415166/atime:1435052450/md5:dfa7b52c86e56bd67fa4002f6ed19854/ctime:1422381567
x-timer
S1570413943.658352,VS0,VE0
date
Mon, 07 Oct 2019 02:05:42 GMT
x-amz-request-id
29D722C296265892
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/png
abp
6
x-cache-hits
3371
native
native.adscale.de/
157 B
602 B
XHR
General
Full URL
https://native.adscale.de/native
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1170
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.246.233 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-246-233.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
7f8d27dea05cdff3224bb6a4795cd38f63cc7eab46d8fdd08a45336a0f9ebf10

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

Date
Mon, 07 Oct 2019 02:05:42 GMT
P3P
CP=NOI PSA OUR
Content-Type
application/json
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Robots-Tag
none
Content-Length
157
creative_js.js
vidstat.taboola.com/vpaid/units/14_12_0/creatives/
4 KB
2 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191002-10-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 c90147ea5199ff7ce77981c8da4247c4.cloudfront.net (CloudFront), 1.1 varnish
age
2569686
x-amz-meta-mtime
1499351521
x-cache
Hit from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
1827
x-served-by
cache-hhn4030-HHN
last-modified
Wed, 06 Sep 2017 08:46:00 GMT
server
AmazonS3
x-timer
S1570413943.658569,VS0,VE0
etag
"0df6cb700db4e2c8b3b7dcb734e91cb0"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
7gUcLzi9Khb5x-2SymG6R2mlKzrS3XKJ2sLgDHJDdcYZJ_oPKcTwKw==
x-cache-hits
6575557
getAd
video-adserver.ibillboard.com/ Frame 2DC8
1 KB
1 KB
XHR
General
Full URL
https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=2d21f41b1e&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.126 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-126.billboard.cz
Software
ibillboard /
Resource Hash
5dc42893eef87553d41f353899f7cb93675cd4cf9f4f6f1fc8abbeecc83c73d1

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
ibillboard
Vary
*
Content-Type
text/xml
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
1033
Expires
Tue, 01 Jan 1991 00:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 2DC8
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=23481&eventId=21&plr=3&cb=0.7655087459110794&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2Fhttps%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dur=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
data
lb67.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb67.s400.meetrics.net/data?/57lyDLGAAKktFLkqFFlqwF23A52AwwA/k0FDEmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90A30Ax5Ay1AywAxmAjwFpkF9kElzFr0FvwFmhEwhF91Ax4A53A13AzxAzmAjpFk9BxzA4yA45A4zA22A00AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91Ax4A53A13AzxAzmAhwFk9B1xA45A31A3zAxzAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wA0xAz5A0yA2zAzBELlnFBUkzFnBP1FAAAAAAABA5sAPCAAFAAA5sTjx1APAAAFAAA5sTdfkAPAAA1IASCABjx1AZBAAOA55A55A85B55A58E55A55AGAx4Az4A3yArjx1ASksFQQjAAAAAAAAAAAAEAAAA5sAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFGA3yA44E5wAMAxzA4yA45A4zA22A00AGAkpFylFj0FAAAAKA03A0xA5yA1yAwxAKA1xA45A31A3zAxzAGAihFuuFlyFKA1xA45A31A3zAxzAKA1xA45A31A3zAxzAwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFd1IASCAYLAaBAFAAAjx1AAAZHo0F0wFz6BvvAhkFyuAhkFmhFytFxuAhkFp0FpvFuuBjvFtvBihFuuFlyF/zEpkF9zA51A3wA22Am0Ez9By0A15A50Aw3AmrEpkF9zAz2A44Az3AmiEpkF9xAw0A15A22A1mA3wF09BImBjsFpjFr1FysF9oE00FwzF6vAvhEkjFspFjrFunEukEv1FisFljFspFjrFuuEl0FvwEjzFvjEspFjrF/4EhpF9BELBFPqFzzFzoFz2BUqFoCF6LFJSFouFK2FDwBwJF6yFG6FySEZWFJ0BH5FK1FtFFtXFm3B20A4IEr2FLlFa4FwfE0NFjWFBGFrMFtGFuwBKTFMOFt5Ef2BFlFE3FtKFxJFqhFXaFqEFqyFahF4VEnEFJaFKfFfwFBoF3CFsoFwxF00B5VEuyBxzB0xAi4BIyBnRFMoFovFsyBQDF11AMsFZ3BuoF2uFyCF0CFnjFzFFrxBiVFh0B1iFLYF3wBLmFKqFzhED0BL5BYhFwjESfFQ0BXKFKEFo0BKOF34BEaFiyBB1FwJEtOFjPFWzBRiFNFFlGFhxBpvFapFmnF6vFLwFFxBxnE0ZEDZFsnFzxByfESFFzTE6qF6rF1CFRQFotB0TF1fFTMFXEFMwFIrFSaFFwF5KFlwFBmBzpFn9BDnFwBEyLFKTF6LFznFuyFOyFLQFyaFFBFFmB1yFsmFp4F9xAmhEk1FysF9BEJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAQtjFQmKaYA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 07-Oct-19 02:05:41 GMT
truncated
/ Frame 92E8
205 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
875015f6d262d1a35165fa89db1c0cfa60e4c8964934c1523586c6b73a54ac50

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
text/javascript
st
imprammp.taboola.com/ Frame E1B8
0
0
Document
General
Full URL
https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=AE029AE7B24855586605357985&cicmp=1657475&cijs=1&dast=V7fssCFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNVsMJsvJajmbQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfb5ZcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAFAfDue7Wl93ocH1edn8AADwEgAAADCiQAAzgNJUAVOQcnAAAAAAAAAAAsPz____HAOgRn8kAZCgN3hj0ADz4ADwIAQAAZA2dOzdvb1z71hAVJBYxAgAAAIBkavM4mtQJlUUVAABBuhXAFQBAQNvo_YVDlu6gxFsYAAAAwdgCPSx-v9lh1_jdLgMAAAAAAAAAMPs_-0cTIhpzSwtiKeBV-wUEAFj7BQQAYFM3AIC3ALigI2jFYLA6g5hsRrvJ7AAAAADu_v____VAZDmcmWyr2WazWQ5Xi83KY5m4Zh7bbORxTJzD2fZCYz9kw1VgYvpGhGX2-w4KyunpMbsMMpbLZFALZE2Ty28QHzQMy8kgmN-ELUaryWSzHM6Wi8lgOBqORvsTuNEAJ2g4HCx2g8VusRhOFpPRYDlYoEAMJjghw9FmshrtVrvJcjgZjWabyQYpWrWajTaD4Wo2me12q-FguByNkKI1i9lkspiNlrvNYDkZDYaT4RBhxuIcTCYT01rmWy3Xos1o5VaObLO1yrlZbIYL58i18KxFr4_ptBxNJjPbFgUDlPYiuEgnmtPl73JZ3pq3xa1z-hwWsURzskgnssu-shzOTLbVbLPZLIerxWblsUxcM49tNvI4Js7hbN-xOAeTycS0lvlWy7VoM1q5lSPbbK1ybhab4cI5ci08a9HrYzotR5PJzLZvrHaD0WKzHE32jdVuMFpslqPJvkNn-K4-Z6PyplV4hMbnM-U3zJwGhctg8f4kpsW0Ozt4fr-jU6W6aIwN2TehMBs8BoMilghOF-lE9DKeLmKJ5GmRTpSTxWDhWq6Wu-Fis9qsJovNaDMceRwmi2U0MWwmYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HhhiN5rrZXDFYzjWDVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HlQEkdgoA!&excid=22&tst=1&docw=0&cs=false
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash

Request headers

:method
GET
:authority
imprammp.taboola.com
:scheme
https
:path
/st?cipid=8045671&ttype=0&cirid=AE029AE7B24855586605357985&cicmp=1657475&cijs=1&dast=V7fssCFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNVsMJsvJajmbQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfb5ZcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAFAfDue7Wl93ocH1edn8AADwEgAAADCiQAAzgNJUAVOQcnAAAAAAAAAAAsPz____HAOgRn8kAZCgN3hj0ADz4ADwIAQAAZA2dOzdvb1z71hAVJBYxAgAAAIBkavM4mtQJlUUVAABBuhXAFQBAQNvo_YVDlu6gxFsYAAAAwdgCPSx-v9lh1_jdLgMAAAAAAAAAMPs_-0cTIhpzSwtiKeBV-wUEAFj7BQQAYFM3AIC3ALigI2jFYLA6g5hsRrvJ7AAAAADu_v____VAZDmcmWyr2WazWQ5Xi83KY5m4Zh7bbORxTJzD2fZCYz9kw1VgYvpGhGX2-w4KyunpMbsMMpbLZFALZE2Ty28QHzQMy8kgmN-ELUaryWSzHM6Wi8lgOBqORvsTuNEAJ2g4HCx2g8VusRhOFpPRYDlYoEAMJjghw9FmshrtVrvJcjgZjWabyQYpWrWajTaD4Wo2me12q-FguByNkKI1i9lkspiNlrvNYDkZDYaT4RBhxuIcTCYT01rmWy3Xos1o5VaObLO1yrlZbIYL58i18KxFr4_ptBxNJjPbFgUDlPYiuEgnmtPl73JZ3pq3xa1z-hwWsURzskgnssu-shzOTLbVbLPZLIerxWblsUxcM49tNvI4Js7hbN-xOAeTycS0lvlWy7VoM1q5lSPbbK1ybhab4cI5ci08a9HrYzotR5PJzLZvrHaD0WKzHE32jdVuMFpslqPJvkNn-K4-Z6PyplV4hMbnM-U3zJwGhctg8f4kpsW0Ozt4fr-jU6W6aIwN2TehMBs8BoMilghOF-lE9DKeLmKJ5GmRTpSTxWDhWq6Wu-Fis9qsJovNaDMceRwmi2U0MWwmYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HhhiN5rrZXDFYzjWDVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HlQEkdgoA!&excid=22&tst=1&docw=0&cs=false
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
t_gid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx/1.13.12
accept-ranges
bytes
date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 varnish
x-served-by
cache-hhn4061-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1570413943.750760,VS0,VE8
content-length
0
cmTagFEED_MANAGER.js
vidstat.taboola.com/vpaid/units/23_14_12/infra/
766 KB
180 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/units/23_14_12/infra/cmTagFEED_MANAGER.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
4f9a3ab1fb44278cb1ab0148d38cf2270ac083df68454ed2feae820f41b984c5

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 c4ada86230c95b165d889d1f1d10389d.cloudfront.net (CloudFront), 1.1 varnish
age
389556
x-amz-meta-mtime
1570024235
x-cache
Miss from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
183524
x-served-by
cache-hhn4030-HHN
last-modified
Wed, 02 Oct 2019 13:50:46 GMT
server
AmazonS3
x-timer
S1570413943.749518,VS0,VE0
etag
"93e3a68791eaf825435147972a6c5fa8"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA56
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
ddUz-paLJDqlfDu3dwhL7QFncBYV6ZsBwqFJXkpbTIB2PdZ7LZV5bA==
x-cache-hits
280274
cmOsUnit.css
vidstat.taboola.com/vpaid/units/23_14_12/assets/css/
34 KB
6 KB
Stylesheet
General
Full URL
https://vidstat.taboola.com/vpaid/units/23_14_12/assets/css/cmOsUnit.css
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
3dba93f65c632536a0fcba4dff71f82f7d6ae88b3a2814d82a1b1876558d79c1

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 b8b7a48d4425abc8f20c14956fccf2e5.cloudfront.net (CloudFront), 1.1 varnish
age
389638
x-amz-meta-mtime
1570024231
x-cache
Miss from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
6240
x-served-by
cache-hhn4030-HHN
last-modified
Wed, 02 Oct 2019 13:50:40 GMT
server
AmazonS3
x-timer
S1570413943.749484,VS0,VE0
etag
"1112e8ccb1e3ed0d2e59d31564a5dfae"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53
accept-ranges
bytes
content-type
text/css
x-amz-cf-id
Ktll1Ozp5AZ78xasqYSbajvQs9Ak601uUgZ17ssYe8_mNuKkO5Qhyg==
x-cache-hits
434468
userconnect.js
js.adscale.de/
13 KB
5 KB
Script
General
Full URL
https://js.adscale.de/userconnect.js
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1170
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
uCC6CzbG4eeBE1xtCmZfElydHe8jGhl9
Content-Encoding
gzip
Last-Modified
Sun, 06 Oct 2019 22:55:04 GMT
Server
AmazonS3
x-amz-request-id
DA58C8E6E607B595
ETag
"5378ec64224df70177fba5bf02e1eb95"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Mon, 07 Oct 2019 02:05:42 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4106
x-amz-id-2
B0ifqy7kTSRMisP8EQOLSQIlEgQOBuwlngT88E/RewsSP5wLKrSgyb4K1VeM7/4XxSFw9SyUpVU=
0
d.nativendo.de/cds/delivery/render/54orvr40/182yo/5k074/7rvuo/
4 KB
2 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/render/54orvr40/182yo/5k074/7rvuo/0
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1170
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
761e92a356ff5bc6f216340957f2c95665ac5b58be82fdd74bb0b9d5b96e6e8a

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
last-modified
Mon, 07 Oct 2019 02:05:42 GMT
server
Apache
vary
Accept-Encoding
content-type
text/javascript; charset=utf8
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
alt-svc
clear
content-length
1493
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
64d1690d-2df7-4358-ab26-8e5d95f71a08
t.nativendo.de/cds/tracking/event/
0
172 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/64d1690d-2df7-4358-ab26-8e5d95f71a08?aid=182yo&floor=NjRkMTY5MGQtMmRmNy00M2W4zZLKSgXcYfFQoQ&cpm=&dsp=1&t[0]=rtb%2Fauction&t[1]=rtb%2Frequest&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1570413943
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1170
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 google
last-modified
Mon, 07 Oct 2019 02:05:42 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
vast
tracking.m6r.eu/sync/ Frame 2DC8
490 B
926 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/vast?checkcookies=true&ibbId=&slotId=346a3f1b-2167-4e54-8af3-4a8d2910a189&target=https%3A%2F%2Fvideo-adserver.ibillboard.com%2FgetAd%3Ftagid%3D346a3f1b-2167-4e54-8af3-4a8d2910a189%26bust%3D2d21f41b1e%26ref%3Dhttps%253A%252F%252Fwww.giga.de%252Fwebapps%252Fpaypal%252Ftipps%252Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%252F%26ngresponse%3Dtrue%26nu%3D%24%24DMP_SEGMENTS_NUGGAD%24%24%26impid%3Da119b702-7153-4200-a9ea-d2f7bea2dde1
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
b031ac2de0397b38e928e3e3a15ac047a5f935c5238c849abf84edfae1f34176

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
nginx
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/xml; charset=utf-8
Content-Length
490
d8ffdf72-1c83-4b9f-9d25-3b7261934c3c.jpg
c.nativendo.de/cdn/asset/media/crt/48139/2/3/
22 KB
23 KB
Image
General
Full URL
https://c.nativendo.de/cdn/asset/media/crt/48139/2/3/d8ffdf72-1c83-4b9f-9d25-3b7261934c3c.jpg?v=1568186613&width=350
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
2606:4700:20::6819:ac0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
5212afd7eaaffe21e9ecac742a18d98c85b513df6c4c3d5243a4fe8623c61c60

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 google
cf-cache-status
HIT
age
242174
cf-polished
origSize=24288, status=webp_bigger
status
200
alt-svc
clear
content-length
22902
cf-bgj
imgq:100
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
image/jpeg
cache-control
public, max-age=31536000
accept-ranges
bytes
cf-ray
521c4fc6588fcbac-VIE
expires
Tue, 06 Oct 2020 02:05:42 GMT
/
track.adform.net/adfserve/
Redirect Chain
  • https://track.adform.net/adfserve/?bn=32440758;1x1inv=1;srctype=3;ord=1570413942
  • https://track.adform.net/adfserve/?CC=1&bn=32440758;1x1inv=1;srctype=3;ord=1570413942
35 B
402 B
Image
General
Full URL
https://track.adform.net/adfserve/?CC=1&bn=32440758;1x1inv=1;srctype=3;ord=1570413942
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
37.157.6.246 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
server
nginx
status
200
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate, no-transform
content-type
image/gif
expires
-1

Redirect headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
server
nginx
status
302
location
https://track.adform.net/adfserve/?CC=1&bn=32440758;1x1inv=1;srctype=3;ord=1570413942
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate, no-transform
content-type
text/html; charset=utf-8
expires
-1
view
securepubads.g.doubleclick.net/pcs/ Frame 194D
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuXslEUWCPd8xKm5qX5wWinCzJ5K2VPSWEzAy45neaZ38bL8ECTxLTkQl8vGDWsjcCtTpqVh48WBLjhgdqaWFg8cEbe1JQAqA3mNfJDs0ax3qAYWKpKQ5UzuR1fPBDTGOBp8YqBnAwQ6AnE-ifmp3COJGZdXwTggtxpBlTVddal9u3FyQqQm1Qw5WcAaqPOwHNHj-4mNGkiVoiZo_dXkSzVL6Sh7It-XqiMZgKCuAnWeZq48TeRGBrnD-8zUMPs01gsvu9rn5o7xpe2vkLk41PImYpMTHU30bN9mscN&sig=Cg0ArKJSzJjov8fXLXpiEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Mon, 07 Oct 2019 02:05:42 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
dcmads.js
www.googletagservices.com/dcm/ Frame 194D
4 KB
2 KB
Script
General
Full URL
https://www.googletagservices.com/dcm/dcmads.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_modern_rendering_2019093001.js?21064579
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
4a355c03b8f32674c198142853d19219d34781b48596907e9a333e5e4c984f08
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 01:18:56 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 02 Oct 2019 14:34:00 GMT
server
sffe
age
2806
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=3600
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
2039
x-xss-protection
0
expires
Mon, 07 Oct 2019 02:18:56 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 194D
78 KB
29 KB
Script
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_modern_rendering_2019093001.js?21064579
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
b55f0e65314298aa6644034ba593878fdaa54d2110c57c35857a46fa54361fab
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570187668844456"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29696
x-xss-protection
0
expires
Mon, 07 Oct 2019 02:05:42 GMT
64d1690d-2df7-4358-ab26-8e5d95f71a08
t.nativendo.de/cds/tracking/event/
0
170 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/64d1690d-2df7-4358-ab26-8e5d95f71a08?noc=54orvr40&aid=182yo&cid=5k074&cti=7rvuo&imp=25&t=ad%2Fview&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1570413943
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1170
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
via
1.1 google
last-modified
Mon, 07 Oct 2019 02:05:42 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
getAd
video-adserver.ibillboard.com/ Frame 2DC8
48 B
590 B
XHR
General
Full URL
https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=2d21f41b1e&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ngresponse=true&nu=n4%3D2%26n3%3D1&impid=a119b702-7153-4200-a9ea-d2f7bea2dde1
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.126 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-126.billboard.cz
Software
ibillboard /
Resource Hash
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
ibillboard
Vary
*
Content-Type
text/xml
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
48
Expires
Tue, 01 Jan 1991 00:00:00 GMT
userconnect
ih.adscale.de/
95 B
364 B
Script
General
Full URL
https://ih.adscale.de/userconnect?ssl=1&sid=192243&cbfn=stroeerCoreConnect&ts=1570413942862&umd=false
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
70072788613bde80533a3cb95d5a16c924011004b1d861093610379370beb859

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Server
Apache-Coyote/1.1
Content-Type
application/javascript
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
95
Expires
Mon, 07 Oct 2019 02:05:42 GMT
impl_v53.js
www.googletagservices.com/dcm/ Frame 194D
22 KB
9 KB
Script
General
Full URL
https://www.googletagservices.com/dcm/impl_v53.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/dcm/dcmads.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
ba040df724e8108d3b718525fa7d4081fca618c1d52fd3ac847a1ac8cf716a0a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 06 Oct 2019 10:19:56 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 23 Sep 2019 17:46:07 GMT
server
sffe
age
56746
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=31536000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
9516
x-xss-protection
0
expires
Mon, 05 Oct 2020 10:19:56 GMT
B23012841.252865594;dc_ver=53.145;sz=300x250;u_sd=1;dc_adk=2189997799;ord=11l1zc;click=https%3A%2F%2Fadclick.g.doubleclick.net%2Fpcs%2Fclick%3Fxai%3DAKAOjsvCmHiEyl-LlIT1JrUne8Fpsuga-_ItOQNnUaKmrnYk...
ad.doubleclick.net/ddm/adj/N497403.422087STROEERCONTENTGROU/ Frame 194D
22 KB
10 KB
Script
General
Full URL
https://ad.doubleclick.net/ddm/adj/N497403.422087STROEERCONTENTGROU/B23012841.252865594;dc_ver=53.145;sz=300x250;u_sd=1;dc_adk=2189997799;ord=11l1zc;click=https%3A%2F%2Fadclick.g.doubleclick.net%2Fpcs%2Fclick%3Fxai%3DAKAOjsvCmHiEyl-LlIT1JrUne8Fpsuga-_ItOQNnUaKmrnYk3rGBUeHHA2e4sOSc5Sl_G10QB5wg3WkD4daXl42FDbo-wzARr6f_w_6nPUNarSE-v7B2Rg5RUCm-UNQXM5kL6LkeDhl7kvXa-atATiiCyhWSk5ZOYBrD4U758UQpynaHBYWtfyZOhMSm9H0BGiwUqd7b8vC7CYm0JemQfJBDF-UkI2dUm_UDzzsDDqhbkrBmQ5uuTirdaW--YFK5E3VJAmxGXmStM8KBJiFqBw%26sig%3DCg0ArKJSzP1fzU42EVKlEAE%26urlfix%3D1%26adurl%3D;dc_rfl=1,https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F$0;xdt=0;crlt=g2Gk.rw2Q*;osda=2;sttr=11;prcl=s?
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/dcm/impl_v53.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.21.230 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s13-in-f6.1e100.net
Software
cafe /
Resource Hash
a4086c39edbec90f4f71d0c6f793e8b10331ed271f249e7d9f652509b6a0ff84
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
br
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
no-cache, must-revalidate
content-disposition
attachment; filename="f.txt"
content-type
text/javascript; charset=UTF-8
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
10460
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
Cookie set map
ih.adscale.de/ Frame 2B28
0
0
Document
General
Full URL
https://ih.adscale.de/map?format=display&ssl=1
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
ih.adscale.de
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
uu=e265b4ffd16840849bb797d943145325; tu=4#1286467131#48~f6a5f661ec1b9b0662b946c7bcdf53f3~436226~0~0; ng=2#2300827882#26173565#0#d3~4&d1~1&d10~3&d9~2&d4~1&d7~2&d2~3&d11~3&d12~2&d8~2
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Mon, 07 Oct 2019 02:05:42 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:42 GMT
Content-Length
675
Connection
keep-alive
Set-Cookie
tu=4#513390381#48~f6a5f661ec1b9b0662b946c7bcdf53f3~436226~0~0#101~~436226~436226~1#38~~436226~436226~1#39~~436226~436226~1#40~~436226~436226~1#72~~436226~436226~1#42~~436226~436226~1#75~~436226~436226~1#63~~436226~436226~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None
express_html_inpage_rendering_lib_200_260.js
s0.2mdn.net/879366/ Frame 194D
119 KB
41 KB
Script
General
Full URL
https://s0.2mdn.net/879366/express_html_inpage_rendering_lib_200_260.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:800::2006 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
76d0d32ecf3e068833862d36267bb22f983440a9e102e8411819f0f97360da56
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 06 Oct 2019 14:30:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
41734
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
41789
x-xss-protection
0
last-modified
Wed, 31 Jul 2019 21:01:46 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
access-control-allow-origin
*
cache-control
public, max-age=86400
accept-ranges
bytes
timing-allow-origin
*
expires
Mon, 07 Oct 2019 14:30:08 GMT
UFYwWwmt.js
tpc.googlesyndication.com/sodar/ Frame 194D
41 KB
15 KB
Script
General
Full URL
https://tpc.googlesyndication.com/sodar/UFYwWwmt.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
5056305b09ad6474ea540f796c79be51d6b8e96043cb3d7bc4ef774e56765f4f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sun, 06 Oct 2019 20:10:04 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 09 May 2018 20:45:00 GMT
server
sffe
age
21338
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=31536000
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
15207
x-xss-protection
0
expires
Mon, 05 Oct 2020 20:10:04 GMT
truncated
/ Frame 194D
213 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
ca397f090cc73c01d9f4a9d39df24f6dc3e4d187a78d6167a40a32b961a34a0f

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
Enqz_20U.html
tpc.googlesyndication.com/sodar/ Frame D332
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/sodar/Enqz_20U.html
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/UFYwWwmt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/sodar/Enqz_20U.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
8395
date
Sun, 06 Oct 2019 20:10:48 GMT
expires
Mon, 05 Oct 2020 20:10:48 GMT
last-modified
Wed, 09 May 2018 20:45:00 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
21294
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
lidar.js
www.googletagservices.com/activeview/js/current/ Frame 194D
80 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/lidar.js?cache=r20110914
Requested by
Host: s0.2mdn.net
URL: https://s0.2mdn.net/879366/express_html_inpage_rendering_lib_200_260.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
b1cda027785ed80cd4d33b7f41b1bf9a67d8ef4812113cc01804041ac68b84b0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1570187668844456"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29321
x-xss-protection
0
expires
Mon, 07 Oct 2019 02:05:42 GMT
cc.html
s0.2mdn.net/9452533/1569406398250/ Frame BBDF
0
0
Document
General
Full URL
https://s0.2mdn.net/9452533/1569406398250/cc.html
Requested by
Host: s0.2mdn.net
URL: https://s0.2mdn.net/879366/express_html_inpage_rendering_lib_200_260.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:800::2006 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
s0.2mdn.net
:scheme
https
:path
/9452533/1569406398250/cc.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
access-control-allow-origin
*
content-length
2162
date
Sun, 06 Oct 2019 22:09:15 GMT
expires
Mon, 07 Oct 2019 22:09:15 GMT
last-modified
Wed, 25 Sep 2019 10:13:18 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=86400
age
14187
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
view
googleads4.g.doubleclick.net/pcs/ Frame 194D
0
536 B
Image
General
Full URL
https://googleads4.g.doubleclick.net/pcs/view?xai=AKAOjssUGgMQR5eb477FwicDkhG1bI0cdlXJmLqlMZ12Ou6VdiDFBKefDlTDrljW3fnxkjK9dpy0k90IzIScFxg7AKLD6fxpkmO6nvfXydzRgB9ElUgXMAtAthH_49ORGyDViQKREpCkA3Y&sig=Cg0ArKJSzHgEC8IjSlrfEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.207.34 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s24-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Mon, 07 Oct 2019 02:05:42 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
zaU
tracker-adserver.ibillboard.com/error/impid/a119b702-7153-4200-a9ea-d2f7bea2dde1/iid/c6e97f17-c78b-4aa5-9751-1abb93aa91a1/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2... Frame 2DC8
0
272 B
Image
General
Full URL
https://tracker-adserver.ibillboard.com/error/impid/a119b702-7153-4200-a9ea-d2f7bea2dde1/iid/c6e97f17-c78b-4aa5-9751-1abb93aa91a1/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2910a189/adid/85a0d494-5864-4a1e-c578-9fc94f9efa60/sensitive/zaU?erc=303
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.126 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-126.billboard.cz
Software
ibillboard /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*, *
Date
Mon, 07 Oct 2019 02:05:43 GMT
Access-Control-Allow-Credentials
true
Server
ibillboard
Connection
keep-alive
Transfer-Encoding
chunked
Access-Control-Allow-Methods
GET
tag
a.teads.tv/page/68592/ Frame 2DC8
1 KB
827 B
Script
General
Full URL
https://a.teads.tv/page/68592/tag
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
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
01295ef44ccf7fdfaea9e0be7cc992544e0680b5fa8275ebc6b985734f89e867

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:42 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
private, must-revalidate, max-age=3600
access-control-allow-credentials
true
content-length
551
expires
Mon, 07 Oct 2019 03:05:42 GMT
teads-format.min.js
a.teads.tv/media/format/v3/
706 KB
184 KB
Script
General
Full URL
https://a.teads.tv/media/format/v3/teads-format.min.js
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/page/68592/tag
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
04b63a4700b9d80a8cf18c7990b705e364ea48c31f5a47a5a8e0d473ca7f2e94

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:43 GMT
content-encoding
gzip
last-modified
Thu, 03 Oct 2019 14:37:26 GMT
x-amz-request-id
43EF146D41119A34
etag
"6f635109adf34de811507ccbb0311fbf"
vary
Accept-Encoding
content-type
text/javascript;charset=utf-8
status
200
cache-control
private, must-revalidate, max-age=600
x-bucket
7
accept-ranges
bytes
content-length
187490
x-amz-id-2
MNoO1tG+bOWp1cegTjygjqJaqUFZLjqIwhUIPG8+n3sizfxbzdWRDFQGd+MxMr2AK7wnmUm0Ms4=
expires
Mon, 07 Oct 2019 02:15:43 GMT
64d1690d-2df7-4358-ab26-8e5d95f71a08
t.nativendo.de/cds/tracking/event/
0
193 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/64d1690d-2df7-4358-ab26-8e5d95f71a08?aid=182yo&t=data%2Finventory&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1570413943
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1170
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
via
1.1 google
last-modified
Mon, 07 Oct 2019 02:05:43 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
index.html
cmp.teads.mgr.consensu.org/ Frame B0C6
0
0
Document
General
Full URL
https://cmp.teads.mgr.consensu.org/index.html
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:292::2c92 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash

Request headers

Host
cmp.teads.mgr.consensu.org
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

x-amz-id-2
eP74N5mDf2mwuUwz6E0m831egGDvXvr6HEIydDhB20yVDuv4ZE6ina8YQaGiXGlfbz2w11Bw+zo=
x-amz-request-id
93A9209AF986CF84
Last-Modified
Fri, 14 Sep 2018 07:42:32 GMT
ETag
"e7d6c2974a38b7ff77a560e83789f66a"
Accept-Ranges
bytes
Content-Type
text/html
Content-Length
583
Server
AmazonS3
Cache-Control
max-age=300
Expires
Mon, 07 Oct 2019 02:10:43 GMT
Date
Mon, 07 Oct 2019 02:05:43 GMT
Connection
keep-alive
index.html
cmp.teads.mgr.consensu.org/ Frame C62E
0
0
Document
General
Full URL
https://cmp.teads.mgr.consensu.org/index.html
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:292::2c92 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash

Request headers

Host
cmp.teads.mgr.consensu.org
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

x-amz-id-2
eP74N5mDf2mwuUwz6E0m831egGDvXvr6HEIydDhB20yVDuv4ZE6ina8YQaGiXGlfbz2w11Bw+zo=
x-amz-request-id
93A9209AF986CF84
Last-Modified
Fri, 14 Sep 2018 07:42:32 GMT
ETag
"e7d6c2974a38b7ff77a560e83789f66a"
Accept-Ranges
bytes
Content-Type
text/html
Content-Length
583
Server
AmazonS3
Cache-Control
max-age=300
Expires
Mon, 07 Oct 2019 02:10:43 GMT
Date
Mon, 07 Oct 2019 02:05:43 GMT
Connection
keep-alive
p
sb.scorecardresearch.com/
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1570413943065&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=20939432&cs_ucfr=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.214.103 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-214-103.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:43 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Expires
Mon, 01 Jan 1990 00:00:00 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1570413943063&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&fv=117
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
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
cache-control
max-age=0, no-cache, no-store
expires
Mon, 07 Oct 2019 02:05:43 GMT
content-length
23
content-type
image/gif
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=slotAvailable&ts=1570413943063&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=117
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
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
cache-control
max-age=0, no-cache, no-store
expires
Mon, 07 Oct 2019 02:05:43 GMT
content-length
23
content-type
image/gif
p
sb.scorecardresearch.com/
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1570413943080&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=27355658&cs_ucfr=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.214.103 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-214-103.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:43 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Expires
Mon, 01 Jan 1990 00:00:00 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1570413943079&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&fv=117
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
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
cache-control
max-age=0, no-cache, no-store
expires
Mon, 07 Oct 2019 02:05:43 GMT
content-length
23
content-type
image/gif
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=slotAvailable&ts=1570413943079&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&slot=multislot&fv=117
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
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
cache-control
max-age=0, no-cache, no-store
expires
Mon, 07 Oct 2019 02:05:43 GMT
content-length
23
content-type
image/gif
data
lb67.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb67.s400.meetrics.net/data?/57lyERNAAUkzFyCPAAANUASCABdfkAZAAAOA55A55A85B55A58E55A55AGAx4Az4A3yArdfkAPAAALb1AAAjjx1APBAAAAAAAATjx1APAAALb1AAAjdfkAPAAAAAAAAATdfkAPAAA1IASCABLb1APAAAFAAA5sTLb1APIEANUASCAHdfkAPAAA1IASCAHjx1ASksFQNdNUASCAgCAYJAFAAAdfkAAAZHo0F0wFz6BvvAhkFyuAhkFmhFytFxuAhkFp0FpvFuuBjvFtvBihFuuFlyF/zEpkF9zA51A3wA23Am0Ez9By0A15A50Aw3AmrEpkF9zAz2A44Az3AmiEpkF9xAw0A15A22A0mA3wF09BImBjsFpjFr1FysF9oE00FwzF6vAvhEkjFspFjrFunEukEv1FisFljFspFjrFuuEl0FvwEjzFvjEspFjrF/4EhpF9BELBFPqFzzFzoFz2BUqFoCF6LFJSFouFK2FDwBwJF6yFG6FySEZWFJ0BH5FK1FtFFtXFm3B20A4IEr2FLlFa4FwfE0NFjWFBGFrMFtGFuwBKTFMOFt5Ef2BFlFE3FtKFxJFqhFXaFqEFqyFahF4VEnEFJaFKfFfwFBoF3CFsoFwxF00B5VEuyBxzB0xAi4BIyBnRFMoFovFsyBQDF11AMsFZ3BuoF2uFyCF0CFnjFzFFrxBiVFh0B1iFLYF3wBLmFKqFzhED0BL5BYhFwjESfFQ0BXKFKEFo0BKOF34BEaFiyBB1FwJEtOFjPFWzBRiFNFFlGFhxBpvFapFmnF6vFLwFFxBxnE0ZEDZFsnFzxByfESFFzTE6qF6rF1CFRQFotB0TF1fFTMFXEFMwFIrFSaFFwF5KFlwFBmBzpFn9BDnFwBEyLFKTF6LFznFuyFOyFLQFyaFFBFFmB1yFsmFp4F9xAmhEk1FysF9BEJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAd1IASCA4NAYJAFAAALb1AOAyyAwyA15AfxB05A02A5fEAAJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAQtjFr++3UA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:43 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 07-Oct-19 02:05:42 GMT
ad
a.teads.tv/page/68592/
118 B
332 B
XHR
General
Full URL
https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A73584%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22native%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=12888522-f0d9-430c-82ec-240ffc72dc7d&formatVersion=2.22.61&env=js-web&netBw=9.3&ttfb=117
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a

Request headers

Accept
application/json; charset=UTF-8
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
max-age=0, no-cache, no-store
access-control-allow-credentials
true
content-length
129
expires
Mon, 07 Oct 2019 02:05:43 GMT
ad
a.teads.tv/page/68592/
118 B
332 B
XHR
General
Full URL
https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A76332%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22multislot%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=12888522-f0d9-430c-82ec-240ffc72dc7d&formatVersion=2.22.61&env=js-web&netBw=9.3&ttfb=117
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a

Request headers

Accept
application/json; charset=UTF-8
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
max-age=0, no-cache, no-store
access-control-allow-credentials
true
content-length
129
expires
Mon, 07 Oct 2019 02:05:43 GMT
/
track.adform.net/Serving/Cookie/
92 B
469 B
Script
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.26390daed7ddbfb83c0ac952dc858f5c.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.6.246 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
6f93b77ac6c571e0ea75a8c144ad98e4723264e1da2d3b49ae0c287dfc1688e1

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
content-encoding
gzip
server
nginx
status
200
vary
Accept-Encoding
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate, no-transform
content-type
text/javascript; charset=utf-8
content-length
201
expires
-1
config.json
gocp.stroeermediabrands.de/absconf/www.giga.de/
11 KB
11 KB
Fetch
General
Full URL
https://gocp.stroeermediabrands.de/absconf/www.giga.de/config.json
Requested by
Host: gocp.stroeermediabrands.de
URL: https://gocp.stroeermediabrands.de/trackcp.js
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
5e418cb008b2f71199f6f58b8fd1449d668c9a17ec0049a6e31b0dacb4c98757

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Mon, 07 Oct 2019 02:05:43 GMT
Cache-Control
max-age=31536000, public
X-Machine
hn86 gocp env
Transfer-Encoding
chunked
Content-Type
application/json; charset=UTF-8
content14_10_18m.js
vidstat.taboola.com/
37 KB
8 KB
Script
General
Full URL
https://vidstat.taboola.com/content14_10_18m.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_12/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
ab8bbbaf028510d8b119cce741f0c2cc94816dcc113d83cac81a6aade6a76fa9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:43 GMT
via
1.1 e0064d0a2437e206ed082e1fa1cdae61.cloudfront.net (CloudFront), 1.1 varnish
age
2571084
x-cache
Hit from cloudfront, HIT
status
200
content-encoding
gzip
content-length
7638
x-served-by
cache-hhn4030-HHN
last-modified
Sun, 14 Oct 2018 13:31:31 GMT
server
AmazonS3
x-timer
S1570413943.214590,VS0,VE0
etag
"d8d81221ec6e604811ce469d899c9c8b"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
x-amz-cf-id
omj5vaGwuVO0u1DUElZ04p0xjblvLHfKzDESlIUndnM3CZOy52LCcg==
x-cache-hits
5960754
oppsula.js
vidstat.taboola.com/oppsula/1.3.6/
15 KB
5 KB
Script
General
Full URL
https://vidstat.taboola.com/oppsula/1.3.6/oppsula.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_12/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
6eeaa330e79de82579d573d85b1e62ee0017782c71406518af6b366b78c7981e

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:43 GMT
via
1.1 cc77875ec7dfc885cffaa2ec6fa578f6.cloudfront.net (CloudFront), 1.1 varnish
age
2548822
x-cache
Hit from cloudfront, HIT
status
200
access-control-max-age
3000
content-encoding
gzip
content-length
5174
x-served-by
cache-hhn4030-HHN
last-modified
Sun, 24 Feb 2019 08:54:20 GMT
server
AmazonS3
x-timer
S1570413943.217004,VS0,VE0
etag
"9eef55ccd492389cc88aa5285cade680"
vary
Accept-Encoding
access-control-allow-methods
GET, HEAD
content-type
application/javascript
access-control-allow-origin
*
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
x-amz-cf-id
Hgfm8sbkx1gxZS7yha4CHuK3b3w9ezttWuCCZ4CAfr_LsIj39lkI7Q==
x-cache-hits
5612284
OvaMediaPlayer.js
vidstat.taboola.com/vpaid/vPlayer/player/v10.4.9/
678 KB
180 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/vPlayer/player/v10.4.9/OvaMediaPlayer.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_12/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
7ffab66a5a2a78de0d9c2e3855aa6e1b8a1885d22efd6b914906ad253c56d616

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:43 GMT
via
1.1 511c8b6c7e903efca023a504d527516b.cloudfront.net (CloudFront), 1.1 varnish
age
332941
x-amz-meta-mtime
1570080946
x-cache
Miss from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
184143
x-served-by
cache-hhn4030-HHN
last-modified
Thu, 03 Oct 2019 05:35:49 GMT
server
AmazonS3
x-timer
S1570413943.235721,VS0,VE0
etag
"e1b062f88ad95bbc2a7c79c3b5c08e29"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
v3EcTCks3pYDaEM-EsyozNrpIZDaVtBrUz1awPuNDhlSsu3zaphTjw==
x-cache-hits
378339
sync
match.taboola.com/ Frame 500E
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7fssCFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNVsMJsvJajmbQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfb5ZcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAFAfDue7Wl93ocH1edn8AADwEgAAADCiQAAzgNJUAVOQcnAAAAAAAAAAAsPz____HAOgRn8kAZCgN3hj0ADz4ADwIAQAAZA2dOzdvb1z71hAVJBYxAgAAAIBkavM4mtQJlUUVAABBuhXAFQBAQNvo_YVDlu6gxFsYAAAAwdgCPSx-v9lh1_jdLgMAAAAAAAAAMPs_-0cTIhpzSwtiKeBV-wUEAFj7BQQAYFM3AIC3ALigI2jFYLA6g5hsRrvJ7AAAAADu_v____VAZDmcmWyr2WazWQ5Xi83KY5m4Zh7bbORxTJzD2fZCYz9kw1VgYvpGhGX2-w4KyunpMbsMMpbLZFALZE2Ty28QHzQMy8kgmN-ELUaryWSzHM6Wi8lgOBqORvsTuNEAJ2g4HCx2g8VusRhOFpPRYDlYoEAMJjghw9FmshrtVrvJcjgZjWabyQYpWrWajTaD4Wo2me12q-FguByNkKI1i9lkspiNlrvNYDkZDYaT4RBhxuIcTCYT01rmWy3Xos1o5VaObLO1yrlZbIYL58i18KxFr4_ptBxNJjPbFgUDlPYiuEgnmtPl73JZ3pq3xa1z-hwWsURzskgnssu-shzOTLbVbLPZLIerxWblsUxcM49tNvI4Js7hbN-xOAeTycS0lvlWy7VoM1q5lSPbbK1ybhab4cI5ci08a9HrYzotR5PJzLZvrHaD0WKzHE32jdVuMFpslqPJvkNn-K4-Z6PyplV4hMbnM-U3zJwGhctg8f4kpsW0Ozt4fr-jU6W6aIwN2TehMBs8BoMilghOF-lE9DKeLmKJ5GmRTpSTxWDhWq6Wu-Fis9qsJovNaDMceRwmi2U0MWwmYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HhhiN5rrZXDFYzjWDVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HlQEkdgoA!&excid=22&docw=0&cijs=1
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_12/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash

Request headers

:method
GET
:authority
match.taboola.com
:scheme
https
:path
/sync?dast=V7fssCFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNVsMJsvJajmbQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfb5ZcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAFAfDue7Wl93ocH1edn8AADwEgAAADCiQAAzgNJUAVOQcnAAAAAAAAAAAsPz____HAOgRn8kAZCgN3hj0ADz4ADwIAQAAZA2dOzdvb1z71hAVJBYxAgAAAIBkavM4mtQJlUUVAABBuhXAFQBAQNvo_YVDlu6gxFsYAAAAwdgCPSx-v9lh1_jdLgMAAAAAAAAAMPs_-0cTIhpzSwtiKeBV-wUEAFj7BQQAYFM3AIC3ALigI2jFYLA6g5hsRrvJ7AAAAADu_v____VAZDmcmWyr2WazWQ5Xi83KY5m4Zh7bbORxTJzD2fZCYz9kw1VgYvpGhGX2-w4KyunpMbsMMpbLZFALZE2Ty28QHzQMy8kgmN-ELUaryWSzHM6Wi8lgOBqORvsTuNEAJ2g4HCx2g8VusRhOFpPRYDlYoEAMJjghw9FmshrtVrvJcjgZjWabyQYpWrWajTaD4Wo2me12q-FguByNkKI1i9lkspiNlrvNYDkZDYaT4RBhxuIcTCYT01rmWy3Xos1o5VaObLO1yrlZbIYL58i18KxFr4_ptBxNJjPbFgUDlPYiuEgnmtPl73JZ3pq3xa1z-hwWsURzskgnssu-shzOTLbVbLPZLIerxWblsUxcM49tNvI4Js7hbN-xOAeTycS0lvlWy7VoM1q5lSPbbK1ybhab4cI5ci08a9HrYzotR5PJzLZvrHaD0WKzHE32jdVuMFpslqPJvkNn-K4-Z6PyplV4hMbnM-U3zJwGhctg8f4kpsW0Ozt4fr-jU6W6aIwN2TehMBs8BoMilghOF-lE9DKeLmKJ5GmRTpSTxWDhWq6Wu-Fis9qsJovNaDMceRwmi2U0MWwmYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HhhiN5rrZXDFYzjWDVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HlQEkdgoA!&excid=22&docw=0&cijs=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
t_gid=cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx/1.13.12
content-type
text/html;charset=ISO-8859-1
machineid
401
accept-ranges
bytes
date
Mon, 07 Oct 2019 02:05:43 GMT
via
1.1 varnish
x-served-by
cache-hhn4061-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1570413943.242431,VS0,VE9
st
convammp.taboola.com/
0
52 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=45&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7h_4CFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNhusNqvdcrgagkawCJPlgsWbUEbD1Wo1XM0Wg8lyslrOphBiLJfJoBZIWGa_76CgnJ4es8sgY7lMBrVA1jS5_G74QtPp8Lnu9brf765z-hx2kcuve1kchsPnL3g4Dw-zX_Q0HD5_wcN5eJjdYr_PaXdr_m6dy2j6vFV3k1vzd4v9Ls_prTRa3mK_z2l3Cy5_i9nldvnlAAAAAPAAoFTYD_EDCAAQAQAAACABAAAAQBFQ8W8hcAEAAACAAVCA9aMBAMXBcK679WU3Olyfl90fAAAPASAAAAMKJAADOE0lABU5BycAAAAAAAAAACz_____MQB6xGcyABlKgz0ADz4AD0QFiUWMAAAAACCZ2jyOJnVCZVEFAECQbgVwBQAQ0DZ6f-EQBgAAQDC2QA-L32922DV-t8sAAAAAAAAAAMz-z_7RhIjG3NKCWAp41X4BAQDWfgEBANjUDQDgLQAu6AhaMRisziAmm9FuMjsAAACAu____389EFkOZybbarbZbJbD1WKz8lgmrpnHNht5HBPncLa90NgP2XAVmJi-EWGZ_b6DgnJ6eswug4zlMhnUAlnT5PIbxAcNw3IyCOY3YYvRajLZLIez5WIyGI6Go9H-BG40wAkaDgeL3WCxWyyGk8VkNFgOFigQgwlOyHC0maxGu9VushxORqPZZrJBilatZqPNYLiaTWa73Wo4GC5HI6RozWI2mSxmo-VuM1hORoPhZDhEmLE4B5PJxLSW-VbLtWgzWrmVI9tsrXJuFpvhwjlyLTxr0etjOi1Hk8nMtkXBAKW9CC7SieZ0-btclrfmbXHrnD6HRSzRnCzSieyyryyHM5NtNdtsNsvharFZeSwT18xjm408jolzONt3LM7BZDIxrWW-1XIt2oxWbuXINlurnJvFZrhwjlwLz1r0-phOy9FkMrPtG6vdYLTYLEeTfWO1G4wWm-Vosu_QGb6rz9movGkVHqHx-Uz5DTOnQeEyWLw_iWkx7c4Ont_v6FSpLhpjQ_ZNKMwGj8GgiCWC00U6Eb2Mp4tYInlapBPlZDFYuJar5W642Kw2q8liM9oMRx6HyWIZTQybiViiNF2kE73uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfbZVH_sSFGo7luNlcMlnPNYJUAAAAAAAAAAJYwZ94EAAAA4DSQxWIwWSwXAEKMdZfgUyrk0Qn8rbjxY4g5Xf4ul-WteVvcOqfPYWUAiZ0C!&cmcv=&pix=31589837&cb=1570413943209&uv=231412&tms=1570413943209&abt=expl_vA!flrr3_vB!sbl_vB!ufm_vE&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1570413941649.052!ts:1570413943209&
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:43 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570413943.244852,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19150-FRA
st
convammp.taboola.com/
0
76 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=72&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7h_4CFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNhusNqvdcrgagkawCJPlgsWbUEbD1Wo1XM0Wg8lyslrOphBiLJfJoBZIWGa_76CgnJ4es8sgY7lMBrVA1jS5_G74QtPp8Lnu9brf765z-hx2kcuve1kchsPnL3g4Dw-zX_Q0HD5_wcN5eJjdYr_PaXdr_m6dy2j6vFV3k1vzd4v9Ls_prTRa3mK_z2l3Cy5_i9nldvnlAAAAAPAAoFTYD_EDCAAQAQAAACABAAAAQBFQ8W8hcAEAAACAAVCA9aMBAMXBcK679WU3Olyfl90fAAAPASAAAAMKJAADOE0lABU5BycAAAAAAAAAACz_____MQB6xGcyABlKgz0ADz4AD0QFiUWMAAAAACCZ2jyOJnVCZVEFAECQbgVwBQAQ0DZ6f-EQBgAAQDC2QA-L32922DV-t8sAAAAAAAAAAMz-z_7RhIjG3NKCWAp41X4BAQDWfgEBANjUDQDgLQAu6AhaMRisziAmm9FuMjsAAACAu____389EFkOZybbarbZbJbD1WKz8lgmrpnHNht5HBPncLa90NgP2XAVmJi-EWGZ_b6DgnJ6eswug4zlMhnUAlnT5PIbxAcNw3IyCOY3YYvRajLZLIez5WIyGI6Go9H-BG40wAkaDgeL3WCxWyyGk8VkNFgOFigQgwlOyHC0maxGu9VushxORqPZZrJBilatZqPNYLiaTWa73Wo4GC5HI6RozWI2mSxmo-VuM1hORoPhZDhEmLE4B5PJxLSW-VbLtWgzWrmVI9tsrXJuFpvhwjlyLTxr0etjOi1Hk8nMtkXBAKW9CC7SieZ0-btclrfmbXHrnD6HRSzRnCzSieyyryyHM5NtNdtsNsvharFZeSwT18xjm408jolzONt3LM7BZDIxrWW-1XIt2oxWbuXINlurnJvFZrhwjlwLz1r0-phOy9FkMrPtG6vdYLTYLEeTfWO1G4wWm-Vosu_QGb6rz9movGkVHqHx-Uz5DTOnQeEyWLw_iWkx7c4Ont_v6FSpLhpjQ_ZNKMwGj8GgiCWC00U6Eb2Mp4tYInlapBPlZDFYuJar5W642Kw2q8liM9oMRx6HyWIZTQybiViiNF2kE73uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfbZVH_sSFGo7luNlcMlnPNYJUAAAAAAAAAAJYwZ94EAAAA4DSQxWIwWSwXAEKMdZfgUyrk0Qn8rbjxY4g5Xf4ul-WteVvcOqfPYWUAiZ0C!&cmcv=&pix=&cb=1570413943233&uv=231412&tms=1570413943233&abt=expl_vA!flrr3_vB!sbl_vB!ufm_vE&ft=0&unm=FEED_MANAGER
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:43 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570413943.244873,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19150-FRA
ngx_pagespeed_beacon
www.giga.de/
0
73 B
XHR
General
Full URL
https://www.giga.de/ngx_pagespeed_beacon?url=http%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_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

status
204
date
Mon, 07 Oct 2019 02:05:43 GMT
cache-control
max-age=0, no-cache
server
nginx
iframe
sync.teads.tv/ Frame 7AD5
0
0
Document
General
Full URL
https://sync.teads.tv/iframe?pid=76332&userId=12888522-f0d9-430c-82ec-240ffc72dc7d&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1570413943249
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
akka-http/10.1.5 /
Resource Hash

Request headers

:method
GET
:authority
sync.teads.tv
:scheme
https
:path
/iframe?pid=76332&userId=12888522-f0d9-430c-82ec-240ffc72dc7d&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1570413943249
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
tt_viewer=7252c22a-2ab3-40ee-83e3-45ba953274cb
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
content-type
text/html; charset=UTF-8
server
akka-http/10.1.5
content-length
1844
expires
Mon, 07 Oct 2019 02:05:43 GMT
cache-control
max-age=0, no-cache, no-store
pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
set-cookie
tt_exelate=; Expires=Tue, 08 Oct 2019 02:05:43 GMT; Domain=.teads.tv; SameSite=None tt_bluekai=; Expires=Tue, 08 Oct 2019 02:05:43 GMT; Domain=.teads.tv; SameSite=None tt_emetriq=; Expires=Tue, 08 Oct 2019 02:05:43 GMT; Domain=.teads.tv; SameSite=None tt_liveramp=; Expires=Tue, 08 Oct 2019 02:05:43 GMT; Domain=.teads.tv; SameSite=None tt_neustar=; Expires=Tue, 08 Oct 2019 02:05:43 GMT; Domain=.teads.tv; SameSite=None tt_salesforce=; Expires=Tue, 08 Oct 2019 02:05:43 GMT; Domain=.teads.tv; SameSite=None tt_dar=; Expires=Tue, 08 Oct 2019 02:05:43 GMT; Domain=.teads.tv; SameSite=None
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=adCall&ts=1570413943064&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&gdpr_status=22&gdpr_consent=[gdpr_consent]&gdpr_reason=220&fv=117
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
cache-control
max-age=0, no-cache, no-store
expires
Mon, 07 Oct 2019 02:05:43 GMT
content-length
23
content-type
image/gif
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=noAd-ivt-doubleVerify&ts=1570413943064&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=117
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
cache-control
max-age=0, no-cache, no-store
expires
Mon, 07 Oct 2019 02:05:43 GMT
content-length
23
content-type
image/gif
f8ca63c8-7a43-4546-bb60-6880f1254a7d
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/f8ca63c8-7a43-4546-bb60-6880f1254a7d
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda

Request headers

Sec-Fetch-Mode
no-cors
Accept-Encoding
identity;q=1, *;q=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Range
bytes=0-

Response headers

Content-Range
bytes 0-1492/1493
Content-Length
1493
Content-Type
video/mp4
c9b270d4-7aa4-4899-8b1c-c6642813e8ca
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/c9b270d4-7aa4-4899-8b1c-c6642813e8ca
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda

Request headers

Sec-Fetch-Mode
no-cors
Accept-Encoding
identity;q=1, *;q=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Range
bytes=0-

Response headers

Content-Range
bytes 0-1492/1493
Content-Length
1493
Content-Type
video/mp4
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
l7rX85QPBBoo6.Ijo6hDg0IGfcD14kv1
Content-Encoding
gzip
Last-Modified
Sun, 06 Oct 2019 22:55:03 GMT
Server
AmazonS3
x-amz-request-id
F400FF69F00615E8
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Mon, 07 Oct 2019 02:05:43 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
6ehEDhidFRch1WjWKfk7Q9UhOngjuYSCKHfN7dSV2F1PUcUPCXhKqPkRDC7radjVyC47AiTPt1w=
adex.js
dmp.theadex.com/d/285/5184/s/
39 KB
14 KB
Script
General
Full URL
https://dmp.theadex.com/d/285/5184/s/adex.js?ts=74178495
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.102 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:43 GMT
content-encoding
gzip
last-modified
Fri, 05 Jul 2019 13:52:01 GMT
server
nginx
etag
W/"5d1f5601-9ca4"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Mon, 07 Oct 2019 02:10:43 GMT
ibb_map.js
bbcdn-bbnaut.ibillboard.com/library/
1 KB
1014 B
Script
General
Full URL
https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.119 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn1.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:43 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 19:12:13 GMT
Server
ibillboard
Vary
Accept-Encoding, Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=604800
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Mon, 14 Oct 2019 01:31:47 GMT
default.js
ups.xplosion.de/loader/69511/
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/69511/default.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
63.32.86.220 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-32-86-220.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Mon, 07 Oct 2019 02:05:43 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
text/javascript
content-length
1687
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
496 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=86763313&src.id=Stroeer
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.186.238.175 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
175.238.186.35.bc.googleusercontent.com
Software
Apache /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
via
1.1 google
server
Apache
p3p
CP="NON DSP COR NID CURa PSAa PSDa OUR STP UNI COM NAV STA LOC OTC",policyref="/w3c/p3p.xml"
status
200
cache-control
no-cache, no-store, must-revalidate
content-type
image/gif;charset=UTF-8
alt-svc
clear
content-length
43
x-application-context
application
expires
Thu, 01 Jan 1970 00:00:00 GMT
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 92E8
53 B
642 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=6670252356
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGthZWNoYWVNQW9sYWVidVo9a2FlY2hhZU1Bb2xhZWJ1Wnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5pdShtKTthLmh1KGwpO2EuV3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5xdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzldfWMuRnU9YjtiLnByb3RvdHlwZT17Rm46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkduOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LcDp0aGlzLkRtKGEpfSxEbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRW06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYT1jLkZ1fHxoYSxzYz1uZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRm4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuTmM9W107dGhpcy5uZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnd0LmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5SZz17fTt0aGlzLmRmPSExfWMuaGs9YjtiLnByb3RvdHlwZT17UXU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrdGhpcy5uYltiXSsiXyIpO3JldHVybiBhfSxZYjpmdW5jdGlvbigpe3RoaXMuZGZ8fCh0aGlzLmRmPWUuYWEoMTApKTtyZXR1cm4gdGhpcy5kZn0sb2I6ZnVuY3Rpb24oYSl7dGhpcy5uYlthXXx8KHRoaXMubmJbYV09MCk7dGhpcy5uYlthXSs9MTs1PHRoaXMubmJbYV0mJiF0aGlzLlJnW2FdJiYodGhpcy5SZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIiwKdGhpcy5RdSgpLCEwKSl9LG5lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFVuOmZ1bmN0aW9uKGEpe3RoaXMuYmEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx3dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy52dChhLmRhdGEpfSwKdnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmJhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lciYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxnZTpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxvZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkdnKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5qaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sR2c6ZnVuY3Rpb24oYSl7dmFyIGI9Cm5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFNuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMuemEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS55cShhKSlyZXR1cm47KGI9dGhpcy5vZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09CmF9fSx5cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSx3ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUnI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0seGU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxGZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PQp0eXBlb2YgZD9kOm51bGx9LFBoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTsKdmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTtxPWcuaGVpZ2h0Kmcud2lkdGg7ZD1nLndpZHRoO2Y9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEZlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWUoYS5lbCwKYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihiKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LEhiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSx6ZTpmdW5jdGlvbihhKXt2YXIgYj0KMCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LEtoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixxLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLG09MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2gocSk7c3dpdGNoKG4lCjQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eT1rO3U9bTtyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHEsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSwKdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHEsNSkrKG4meXxuJnV8eSZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChxLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2U9ZStxJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O209bSt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihtKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksCmY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHE+PjYsZz1xJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihxKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sTnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSwKaGQ6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxxPSExLGM9ITEsZT0hMSxnPSExLGs9ITEsbT0hMSxsPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlRiPyEwOiExfWNhdGNoKHUpe310cnl7cT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwKLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPXE7YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LGxyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LAokbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sVGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxmbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEpvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWGkoKXx8YS5oaigpfHxhLmxyKCl8fGEuRmwoKXx8YS4kbSgpfHxhLlRrKCl8fGEuZm0oKX19O3JldHVybiBudWxsIT1hLkpvKCl9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscT1hLmxlbmd0aDtmPHE7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sWmI6ZnVuY3Rpb24oYSl7YT10aGlzLnphKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sUXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy56YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LEJwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LEd1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5jaShiKSsiOiIrdGhpcy5jaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sY2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGZmOmZ1bmN0aW9uKGEpe3RoaXMuQ2I9YX0seWc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5DYjt0aGlzLmNlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7CmEuZGlzcGF0Y2hFdmVudChmKX0sQmM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLnlnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHEsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3EmJihCPWsuVGEoQixxKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuQmMoQil9LHl0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmIuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuUXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxKdTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuWWIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmNlKGEpfSxjZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnl0KGEpO2lmKGIpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bS5KYygpO20ueWEoYSwhMCk7YT1tLnlhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO20uRGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uSmMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwptLnlhKGYsITApO2Y9bS55YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkRhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sS2Q6ZnVuY3Rpb24oYSl7aWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bS5KYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1tLnlhKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO20uRGEoYSl9fSxMZTpmdW5jdGlvbigpe20mJm0uVj9tLmlzRW5hYmxlZCYmbS5jcCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sY2c6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkdlKGEpfHx0aGlzLlJyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guY2YmJndpbmRvdy5zYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMud2coYSkpcmV0dXJuIHRoaXMud2coYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYWIoYSxiLkxhLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnFkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLlNuKGUsYSk7cmV0dXJuIGV9LGFiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIGw9ZXx8bTtlPSEwO2smJihlPSExKTtpZihsJiZsLlYpaWYobC5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtsLnlhKGEsZSk7ZT1sLnlhKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtlLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHIgaW4gZCllLmRhdGFbcl09ZFtyXTtyZXR1cm4gbC5EYShlLGYsYywiIiwiIixnKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYSxiLGQsZixjLGwsZyxrKX0uYmluZCh0aGlzKSw1MDApfSxqaDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fAo0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxrKSxsLndpdGhDcmVkZW50aWFscz1lLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKHIpe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuamgoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuTmMpZm9yKHZhciBjIGluIHRoaXMuTmMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5OY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueGIoYSk7ZCYmCihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sa2g6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihhLGYuTGEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLmZzKGYucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LApxdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5OYz1hfSxEdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOgpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sS286ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LExyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLmhrfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT0KYXx8e319Yy5naz1iO2IuVGE9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLmp0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkhzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuanE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlhmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlBmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLAptZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuVWY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuWWY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLkpuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLlNmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuSnY9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkdzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmtxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IucHc9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iua2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ycD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuZGQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi55Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuV2Y9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkxuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuVWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLiRkPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLmJlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5Lbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iuamk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Kcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnRkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnRmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07CmIubGc9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkZ2PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRXY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Jcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7CnZhciBrPWMuZ2t8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzEwXTt0aGlzLnRvPXRoaXMuYVszXTt0aGlzLldyPXRoaXMuYVs1XTt0aGlzLmJ0PXRoaXMuYVsxMF07dGhpcy5Ebz10aGlzLmFbM107dGhpcy5Qcz10aGlzLmFbMTBdO3RoaXMuSG89dGhpcy5hWzddO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMuR2k9dGhpcy5hWzJdO3RoaXMuS2k9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5ScD1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSW46dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnRvOnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xcjp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnQ6dGhpcy5DbyhhKX0sQ286ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuRG86dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBzOnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ibzp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS3c6dGhpcy5GaShhKX0sRmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5HaTp0aGlzLkppKGEpfSxKaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2k6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLlJwfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Ibig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmlrPWI7Yi5wcm90b3R5cGU9e3plOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09CmEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LExxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LApsZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubGQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxFcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxZZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnplKHRoaXMuTHEoKSsiIiksCmE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaWt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMuT2k9dGhpcy5hWzVdO3RoaXMuRWk9dGhpcy5hWzhdO3RoaXMubnE9dGhpcy5hWzEwXTt0aGlzLmhtPXRoaXMuYVs0XTt0aGlzLkhrPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuR3c9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1sOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53azp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhPwp0aGlzLk9pOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRWk6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ucTp0aGlzLmdtKGEpfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaG06dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5Hd3x8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MubGwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsCmY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLm9qPWJ9KShjKTt2YXIgTD1jLm9qfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNuPXRoaXMuYVs3XTsKdGhpcy5Vbz10aGlzLmFbMl07dGhpcy5DdT10aGlzLmFbOF07dGhpcy54cz10aGlzLmFbNF07dGhpcy5Fbj10aGlzLmFbNl07dGhpcy5Gbz10aGlzLmFbMl07dGhpcy5Kaz10aGlzLmFbN107dGhpcy5hbD10aGlzLmFbNF07dGhpcy5PcD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs5XX1jLnJvPWI7Yi5wcm90b3R5cGU9e0JuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVW86dGhpcy5CdShhKX0sQnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN1OnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54czp0aGlzLkRuKGEpfSxEbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRW46dGhpcy5FbyhhKX0sRW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkZvOnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLiRrKGEpfSwKJGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFsOnRoaXMuTnAoYSl9LE5wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5PcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucm98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLkJuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuU2w9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5NYT17fTt0aGlzLkk9bnVsbDt0aGlzLktjPTEwMDt0aGlzLkliPTA7dGhpcy5XYT0xNTA7dGhpcy5MYj0wO3RoaXMuanUoYil9LGc6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhPyh0aGlzLkliKyssdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLktjKSk6CjA+dGhpcy5XYSYmKHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5LYykpfSxhdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkliPnRoaXMuV2E/ITA6ITF9LGJmOmZ1bmN0aW9uKCl7dGhpcy5JYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sanU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LEpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuUCgpLCEwKTt0aGlzLk1hW2IubGEoKV09YjtNJiZNLmdoJiZNLlB1KGIpfSxyeDpmdW5jdGlvbigpe3JldHVybiBlLnhlKHRoaXMuTWEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX0sTXI6ZnVuY3Rpb24oYil7Yj1iLkthKCk7Zm9yKHZhciBhIGluIHRoaXMuTWEpaWYoYi5pZD09CnRoaXMuTWFbYV0uS2EoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sSng6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5TbHx8dDsoZnVuY3Rpb24oYyl7Yy5VbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLktjPTEwO3RoaXMuSWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubmE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkJiPSIiO3RoaXMucWc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5LYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxNOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30sCnR1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSxzeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LG11OmZ1bmN0aW9uKGIpe3RoaXMuT2U9Yn0scXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZX0sTmU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhJiYodGhpcy5JYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuS2MpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpOwplbHNlIHJldHVybiExfWNhdGNoKGIpe319LEVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2EoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuYnIoKXx8dGhpcy5ObigpO3RoaXMuQmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSx0eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxObjpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5hYSgxMCkpfSxicjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sVzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj0KYn0sS2E6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmF9LGNhOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMH0sTGM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxJZTpmdW5jdGlvbigpe3JldHVybiExfSxKaDpmdW5jdGlvbihiKXt0aGlzLkJiPWJ9LHB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmJ9LEVoOmZ1bmN0aW9uKCl7dGhpcy5CYj1udWxsfSx2eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuQmImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLnFnfHwodGhpcy5xZz0hMCl9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLlVsfHxwOyhmdW5jdGlvbihjKXtjLnRpPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5JPXRoaXMucGxheWVyPSIiO3RoaXMuTGY9IjEiO3RoaXMuTWY9IjIiO3RoaXMuem49IjMiO3RoaXMuUWM9MDt0aGlzLm5oPQozMDt0aGlzLlJiPVtdO3RoaXMuZ2I9W107dGhpcy5vYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5aZj10aGlzLmZpPSExO3RoaXMuc3RhdHVzPXRoaXMuUWM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLmdmKGIpO3RoaXMua3UoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5maXx8KHRoaXMuZmk9ITAsZS5MZSgpKX0sU2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxEcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5rYSgpXXx8KHdpbmRvd1thLmthKCldPXt9KTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldfHwod2luZG93W2Eua2EoKV1bYi5sYSgpXT17fSx3aW5kb3dbYS5rYSgpXVtiLmxhKCldLmluaXRpYXRvcj0KZS5ZYigpKTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWWIoKV0/d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldKys6d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldPTF9LEpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLmhmKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMueGEoKSl7dGhpcy5EcigpO2lmKCF0aGlzLkpyKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmhmKCk7cmV0dXJufXRoaXMuaGYoKTt0aGlzLkkodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLlpoKCk7dGhpcy5aZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSx1OmZ1bmN0aW9uKGIsCmEpe3RoaXMueGEoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmdiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxaaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuZ2Ipe2Zvcih2YXIgaD0wO2g8dGhpcy5nYi5sZW5ndGg7aCsrKXRoaXMub2NbdGhpcy5nYltoXS5yZWFzb25dPT10aGlzLm9jW2JdJiZhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLHRoaXMub2NbdGhpcy5nYltoXS5yZWFzb25dPHRoaXMub2NbYl0mJihhPVtdLGEucHVzaCh0aGlzLmdiW2hdLmRldGFpbCksYj10aGlzLmdiW2hdLnJlYXNvbik7dGhpcy5vY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITAsYSl9fSx1eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlpmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZn0saGY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxydTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuem59LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5RY30sUmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTGZ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk1mfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5RY30sZ2Y6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxrdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxqczpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMudGl8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR0PXRoaXMuYVsyXTt0aGlzLiRzPXRoaXMuYVsxMF07dGhpcy55dz10aGlzLmFbN107dGhpcy5pbD10aGlzLmFbNl07dGhpcy5Naj10aGlzLmFbN107dGhpcy5Maz10aGlzLmFbMV07dGhpcy5mbz10aGlzLmFbNV07dGhpcy5ncT10aGlzLmFbOV07dGhpcy5tcD10aGlzLmFbOV07dGhpcy5udD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs5XX1jLm1rPWI7Yi5wcm90b3R5cGU9e2N0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kdDp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy54dyhhKX0seHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnl3OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pbDp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5LayhhKX0sS2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5Mazp0aGlzLmVvKGEpfSxlbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZm86dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdxOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5tcDp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLm1rfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5jdCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87CnRoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Uanx8b2E7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLmR4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7CmIuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuVWp8fHBhOyhmdW5jdGlvbihjKXtjLlZqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Wanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmJuPXRoaXMuYVsxXTt0aGlzLm5yPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuQXQ9YjtiLnByb3RvdHlwZT17dW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZtOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLmJuOnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubnI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkF0fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy51bSg0KTsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5xcD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5iYz0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5XKGIpfSwKeGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KSwKYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJgozMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyOwphLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Da3x8c2E7KGZ1bmN0aW9uKGMpe2MuQms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYKKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ29tcGxldGUiKTsKdGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnFwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTt0aGlzLlNlKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMudygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJnRoaXMuVGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy53KCksdGhpcy5yYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sanM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8odGhpcy5yZT50aGlzLnNlJiYoYj0hMSksdGhpcy5HKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSw1MCk6KGEudmcoKSxhLnhnKCksYS5iY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ca3x8dGE7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5HcSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLk1yKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sb3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sR3E6ZnVuY3Rpb24oKXt2YXIgYj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB1YT1jLkRrfHx1YSx2YT1uZXcgdWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFqPXRoaXMuYVsxXTt0aGlzLlR2PXRoaXMuYVs0XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5sbT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLmpsPWI7Yi5wcm90b3R5cGU9e1BqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Rajp0aGlzLlN2KGEpfSxTdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHY6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJzOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMuamx8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlBqKDQpOwooZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0KITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHhhPWMuVm18fHhhOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLkNhPXRoaXMuWGM9ITE7dGhpcy5BaD1lLkhiKDEwKTt0aGlzLmVpPSEwO3RoaXMudGM9dGhpcy5WZz0hMTt0aGlzLkZzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5xaCgpLHRoaXMuWm8oKSx0aGlzLnFiKCkpfSxGczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmNvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLAoiOyIsYi5KP2IuSi5xYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaGU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5oZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkFoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJgoodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxYYjpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSWc6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSwKS3I6ZnVuY3Rpb24oKXtpZighdGhpcy5VZyl7dmFyIGI9dGhpcy55YigpLGE9dGhpcy5JcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVWc9ITApfXJldHVybiB0aGlzLlVnfSxJcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuWGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlhjPSEwKTtyZXR1cm4gdGhpcy5YY30scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLlR0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sVHQ6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuSWcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudWM9ITA7aWYoZS5mYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLnVjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxueDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMubmcmJmIuYWRzJiYodGhpcy5uZz1iLmFkcyk7cmV0dXJuIHRoaXMubmd9LFpvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdhKCEwKTt0aGlzLnUoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5TZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPQohMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLklnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0scWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuS3IoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpOwp0aGlzLnliKCl9ZWxzZSB0aGlzLlZnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpLGI9dGhpcy5YYigpO2EmJiFiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZ2EoKSk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlZnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPQphLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LCRvOmZ1bmN0aW9uKCl7dGhpcy56Y3x8KHRoaXMuemM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnpjIT0KYi5hZHMuc3RhdGUmJih0aGlzLnpjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuemM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRvKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpezA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5laT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5HKHRoaXMuZWksZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGhwOmZ1bmN0aW9uKCl7dGhpcy53eHx8KDEwPHRoaXMuVXY/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5VdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLiR0KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhwKCl9LmJpbmQodGhpcyksNTApKSl9LCR0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlZ2KXt0aGlzLlZ2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciB5YT1jLlVtfHx5YTsoZnVuY3Rpb24oYyl7Yy5XbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5RaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUWgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS54ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwKKG5ldyB5YShhLHRoaXMuSSkpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxUOmZ1bmN0aW9uKCl7dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLktjKX19KX0pKGMpO3ZhciB6YT1jLldtfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGw9dGhpcy5hWzEwXTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm5rPWI7Yi5wcm90b3R5cGU9e0dsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5IbDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLm5rfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuR2woNCk7KGZ1bmN0aW9uKGMpe2MuSmw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5VZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7CmQmJmEmJmEuYWMmJigwPD1oLmluZGV4T2YoZCl8fGEud2QoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlVlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlVlKys7aWYoMTA8dGhpcy5VZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuSmx8fENhOyhmdW5jdGlvbihjKXtjLklsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8Cih0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudGU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5xcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLnFxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucXQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuSWx8fERhOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLktsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXc9dGhpcy5hWzVdO3RoaXMuanY9dGhpcy5hWzNdO3RoaXMuc249dGhpcy5hWzFdO3RoaXMuenM9dGhpcy5hWzddO3RoaXMubW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy5BaT1iO2IucHJvdG90eXBlPXtIdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXc6dGhpcy5pdihhKX0saXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmp2OnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zbjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenM6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9CmMuQWl8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLkh3KDQpOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkZnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMudXQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy51dCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxncDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCkllOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy50a3x8SGE7KGZ1bmN0aW9uKGMpe2Muc2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMuc2t8fElhOyhmdW5jdGlvbihjKXtjLnVrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLnVrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRms9dGhpcy5hWzhdO3RoaXMudHQ9dGhpcy5hWzhdO3RoaXMuT2o9dGhpcy5hWzNdO3RoaXMuUWw9dGhpcy5hWzVdO3RoaXMuR3I9dGhpcy5hWzJdO3RoaXMubHM9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5Saj1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRms6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnR0OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Pajp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWw6dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdyOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMubHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYT1jLlJqfHxMYSxEYz1uZXcgTGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuams9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sbHU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxQbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmprfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmgsZCxmKXt0aGlzLmZiPWE7dGhpcy5BZz10aGlzLm5pPSExO3RoaXMucmg9ZDt0aGlzLlJoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLmZiPW5ldyB6KGEpKTt2YXIgYz10aGlzLnNiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkhlKHRoaXMuZmIudXJsKSYmbS5NZCl7dmFyIGU9bmV3IHooYS51cmwpO2UubHUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uaWEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5raz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5mYi5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5BZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuUmg/dGhpcy5zYi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCExKTp0aGlzLnNiLm9wZW4odGhpcy5mYi5tZXRob2QsdGhpcy5mYi51cmwsITApLHRoaXMubml8fCh0aGlzLnNiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5zYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuc2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuc2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkhlKHRoaXMuZmIudXJsKT9tLk1kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSGUodGhpcy5mYi51cmwpLHRoaXMucmgmJnRoaXMucmgoKX1yZXR1cm4gdGhpcy5zYn19fSkoYyk7dmFyIE1hPWMua2t8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLlZkPSExfWMucGo9YjtiLnByb3RvdHlwZT17cHU6ZnVuY3Rpb24oYSl7dGhpcy5WZD1hfSxvdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LFl0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e053OiJBZENsaWNrVGhydSIsUHc6IkFkRXJyb3IiLFF3OiJBZFN0b3BwZWQiLFR3OiJBZExpbmVhckNoYW5nZSIsVXc6IkFkVGFnUGFyc2VkIixYdzoiQWRWaWRlb0NvbXBsZXRlIiwkdzoiQWRMb2FkZWQiLGF4OiJBZFNraXBwZWQiLGJ4OiJBZFN0YXJ0ZWQiLFJ3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsU3c6IkFkSW1wcmVzc2lvbiIsT3c6IkFkQ3JlYXRpdmVWaWV3IixWdzoiQWRWaWRlb01pZHBvaW50IixXdzoiQWRQYXVzZWQiLFl3OiJBZFZpZGVvU3RhcnQiLFp3OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuVmQsYltkXSl9LFh0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVWQpZm9yKHZhciBiIGluIHRoaXMuSGEuVWQpdGhpcy5IYS5VZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVWRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuVmQmJnRoaXMuWXQoKTt0aGlzLkhhJiZ0aGlzLlh0KCl9fX0pKGMpO3ZhciBOYT1jLnBqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmllPQp0aGlzLnZjPXRoaXMud2I9bnVsbDt0aGlzLkNwPXRoaXMuSmI9dGhpcy5paD0hMTt0aGlzLkxhPSIiO3RoaXMuZGg9ITE7dGhpcy53YT10aGlzLm9kPSIiO3RoaXMuWmc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuJGU9ITE7dGhpcy5wYT1bXTt0aGlzLk9nPXRoaXMuZmM9IiI7dGhpcy5xZT0hMTt0aGlzLnFmPTA7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuSWQ9W107dGhpcy5nYz0iIjt0aGlzLnJmPTA7dGhpcy52aWRlb3BsYXphPQp7fTt0aGlzLkRjPSExO3RoaXMuaXA9dGhpcy5PZD1udWxsO3RoaXMuTGg9dGhpcy5sYz10aGlzLnNnPXRoaXMudWY9dGhpcy5NZD10aGlzLmtlPXRoaXMuUmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5wZD0wO3RoaXMuUWc9ITE7dGhpcy5QZz0xRTM7dGhpcy5aYz0hMTt0aGlzLlFhPTFFMzt0aGlzLk9mPSIifWMubGs9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy53YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLnZjLGFkdGFncmVnZXg6dGhpcy5pZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5paCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5DcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmRoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLndhLAppc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuWmcsc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZmMsaG9tYWRBZHBhdGg6dGhpcy5PZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnFmLEhPTUFEX1ZFUklGSUVEOnRoaXMuR2YsSE9NQURfQkxPQ0tFRDp0aGlzLkVmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm5jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5GZix0ZXN0SGlkZTp0aGlzLmhjLHRlc3RUYWdzOnRoaXMuaWMsdGVzdFRhZ3NKUzp0aGlzLmpjLHRlc3RUYWdzWEhSOnRoaXMuSWQsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMucmYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmlwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUmMsCmJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5rZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5NZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy51Zixjb25maWdGYWlsdXJlczp0aGlzLmhiLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLkloLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5qYix2cGFpZDp0aGlzLmxjLHNraXBBbGxvd2VkOnRoaXMuTGgsdm1hcHM6dGhpcy5raSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuWmMsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sJHE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmKGE9ITApO3JldHVybiBhfSxlZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSxIcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2JdJiYxPT10aGlzLmhiW2JdJiZhLnB1c2goYik7CnJldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLktvKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuR2UoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuRmMoKT9lPWE6ZT1jLnByb3RvY29sKwoiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLkpjKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMud2N8fHRoaXMud2J8fHRoaXMudmN8fHRoaXMuaWUpJiYoZz10aGlzLnJzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuSXEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxHZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT8KYj0hMDp0aGlzLkZjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxGYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5HZShhKTtyZXR1cm4gYn0sSXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PQp0eXBlb2YgdGhpcy5MYSYmMDx0aGlzLkxhLmxlbmd0aClyZXR1cm4gdGhpcy5MYTtmb3IoZCBpbiB0aGlzLkxhKWlmKGI9dGhpcy5MYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLml4O3JldHVybiJub25lIn0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLkloXX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnFkKCksYj10aGlzLktoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LG9oOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LHFzOmZ1bmN0aW9uKGEsCmIpe3ZhciBkPWUuemEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLm9oKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5vaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LHJzOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJgooYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy52YyYmKGE9dGhpcy5xcyhhLHRoaXMudmMpKTtyZXR1cm4gYX0sZnA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuYXAodGhpcy5GYS5jbGllbnRBUElzKX0sYXA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLnB1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5vdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5kaD0hMDt0aGlzLm9kPWE7dGhpcy53YT1iO3RoaXMuJGU9ZDt0aGlzLk9kPWY7dGhpcy5BYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5mcCgpO3RoaXMuZXMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5jcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLndhKXRyeXt0aGlzLndhPWIsdGhpcy54YygpfWNhdGNoKGspe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9fSxwYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sZXM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMub2QrdGhpcy5mZSgiZ2xvYmFsIikpLHRoaXMuV3EuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sY3M6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5mZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sZmU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2Upe3RoaXMua2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQWM9ITEpO3RoaXMuQWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5BYz90aGlzLkFjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5aZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuRWYpKTt0aGlzLk5iKCk7ZS5CYyhrLmp0KTsoYj1lLlpiKHRoaXMucWQoKSkpfHwoYj1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxXcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZmN8fHRoaXMuTGF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8Cm51bGw7dGhpcy5PZz1hLmFkcGF0aHx8IiI7dGhpcy5xZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkloPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZmMmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuR2MoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEdjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuSmMoKSksZD10aGlzLnphKHRoaXMuZmMpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPQoiUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuZmMrdGhpcy5mZSgiY3VzdG9tZXIiKSk7dGhpcy5EYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImN1c3RvbWVyIik7YT90aGlzLmVtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZW09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxTdTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkRjPSEwO3RoaXMuR2MoITApO3JldHVybn19dGhpcy5NZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuc2c9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmpiPQp0aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaGM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5qYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy53Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnZjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5pZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5paD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmxjPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5sYzt0aGlzLkxoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuJGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmtpPWIudm1hcHN8fCIiO3RoaXMuWmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8CjFFMzt0aGlzLk9mPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmdjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuUHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnFlJiYodGhpcy5nYz1udWxsKTt0aGlzLnJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkRjPSEwLHRoaXMuR2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMubXYoKSYmKHRoaXMuaGN8fHRoaXMuamN8fHRoaXMuaWN8fHRoaXMuZ2N8fHRoaXMuSWQpP3RoaXMuJGU/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSksdGhpcy5tZSgpLHRoaXMuTmIoKSk6dGhpcy5ZdSgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlp1KCkpfX0sWXU6ZnVuY3Rpb24oKXt0aGlzLlh1KCk7CnRoaXMuJHUoKX0sJHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsCiIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9CmQpe3ZhciBjPWUuaGQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxadTpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpO3RoaXMuTmIoKX0sT2M6ZnVuY3Rpb24oYSl7dGhpcy5SYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIoYSkpLHRoaXMuTmIoKSx0aGlzLm1lKCkpfSxYdTpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmhoKCkpdGhpcy5PYyh0aGlzLm5jLAoibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5WaCgpfX1lbHNlIHRoaXMuVmgoKX0sVWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLkhiKCkpO3RoaXMuY3YoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm5mLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuaWM9dGhpcy5JZCkmJnRoaXMuaWMubGVuZ3RoKXt2YXIgZD10aGlzLmljLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubmYoKX0sY3Y6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGMsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5VaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5qYyYmdGhpcy5qYy5sZW5ndGgpe3ZhciBkPXRoaXMuamMuc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5VaCgpfSxkdjpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nYz8odGhpcy5xZisrLHRoaXMuRGEobmV3IHoodGhpcy5nYyksdGhpcy5XdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5vZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlNoKCl9LG9mOmZ1bmN0aW9uKGEpe3RoaXMuT2ModGhpcy5GZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LFd1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnFmP3RoaXMubmYoKTp0aGlzLm9mKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuU2goKTp0aGlzLm9mKCJBQUEiKX0sU2g6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5tZSgpfSxoaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUmMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaGgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5PZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk9kJiZ0aGlzLk9kKCl9LGVwOmZ1bmN0aW9uKCl7aWYodGhpcy51ZiYmdGhpcy4kcSgpKXt2YXIgYT10aGlzLkhxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxaaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnBkfHwodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlBnJiYhdGhpcy5RZyYmKHRoaXMuUWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlBnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5uaT0hMCk7cSYmZS5OcigpJiYoYS5BZz0hMCk7ZyYmKGEuUmg9ITApO3JldHVybiBhLmxvYWQoKX0sYnA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxWdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMua2l9LGNwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMuSXYuYmluZCh0aGlzKSx0aGlzLkh2LmJpbmQodGhpcykpfSxJdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMubHEoKX0sSHY6ZnVuY3Rpb24oKXt9LApscTpmdW5jdGlvbigpe2UuQmMoay5rcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYWIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxtdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnJmfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmxrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucG09dGhpcy5hWzFdO3RoaXMuQ209dGhpcy5hWzJdO3RoaXMueGw9dGhpcy5hWzRdO3RoaXMuQ3Q9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMl19Yy5aaj1iO2IucHJvdG90eXBlPXtvbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucG06dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNtOnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueGw6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMuWmp8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLm9tKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmJiPWEuZi5QKCk6dGhpcy5iYj0iIjthLmYuWGcmJmEuZi5YZyh7cGF1c2U6dGhpcy53ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkdoLmJpbmQodGhpcyksbXV0ZTp0aGlzLlBlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuQXYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5pYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlZiPXRoaXMuWWM9ITE7dGhpcy5Jbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkZkPXt9O2Uub2IoIm5ld0JpZ0FkSWQiKTt0aGlzLkxvPWUuYWEoMTApO3RoaXMubGY9MDt0aGlzLldjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuV2M9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYKKGE9dGhpcy5iLmYucygpKSx0aGlzLldjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlZuPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuc2g9dGhpcy5FZD0hMTt0aGlzLmxoPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5lZT0hMTt0aGlzLmJpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYWM9ITE7dGhpcy5zcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5NaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5QZD10aGlzLk9iPXRoaXMub2U9dGhpcy5lZD10aGlzLkdkPXRoaXMucmI9dGhpcy5tYz10aGlzLnVoPXRoaXMua2Q9dGhpcy5udj10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5yYz1bXTt0aGlzLmNjPXt9O3RoaXMuZ3Q9MjAwO3RoaXMuQmY9CnRoaXMuQ2Y9dGhpcy5qZT10aGlzLkFmPXRoaXMuWmU9ITE7dGhpcy52ZD17fX1jLmZrPWI7Yi5wcm90b3R5cGU9e2d1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGJ9LCRoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkNiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5MdSgpO2UudihrLkxuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEtlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5sZisrLGUub2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5lcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJgp0aGlzLkwuaXNFbmFibGVkPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmxjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuJGgoKSxuZXcgUyh0aGlzLGEsdGhpcy5saCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5sYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7CmVsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLktlKGEsYixjKX0sNTApfX0sVmU6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5rZD0hMTt0aGlzLmM9YTt0aGlzLnV1KHRoaXMuYyk7dGhpcy52ZD1uZXcgUWEodGhpcy5jLkt2LHRoaXMudmlkZW8se30pO3RoaXMuTGcoYSk7dGhpcy5yYz10aGlzLkNnKGEpO3RoaXMubnAoKX0sTGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuRmQ9dGhpcy5TcShhKSksdGhpcy5MZyhhLnBhcmVudCkpfSxDZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuQ2coYS5wYXJlbnQpKSxjLnB1c2godGhpcy5DcShhKSkpO3JldHVybiBjfSwKQ3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LFNxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8CmYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5rYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZ2QmJmEuZ2QuZXJyb3ImJmEuZ2QuZXJyb3IuY29kZSYmKGI9YS5nZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlBjLmNvZGU6Yj09Ry5XZC5jb2RlP2UudihrLmh3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpOihlLkxlKCksYj09Ry5KZi5jb2RlJiZlLnYoay5Hcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5qcSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuTXUoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmUudihrLkp2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLnYoay5wdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUudihrLnd3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5Icyx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsuRnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsuR3YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuV2IoYSk7dGhpcy5SYSgpfSxXYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLkplKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSx1dTpmdW5jdGlvbihhKXt0aGlzLm9lPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTsKdGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5aZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLkl4PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7CnRoaXMuVm4mJnRoaXMucGxheWVyLnVlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci51ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuUW4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLlplJiZiLmxvYWQoKTtpZih0aGlzLldoKGIpKXt0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt0aGlzLlRuKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5aZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz0KdGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLm9wKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5zdSgpKTp0aGlzLmMub3JpZ2luLnRnKHcuVGQpfSxzdTpmdW5jdGlvbigpe3RoaXMuQWY9ITA7dGhpcy5yYj10aGlzLm1jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnJiPSEwKTtlLm5lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlVuKHRoaXMuYy5vcmlnaW4udmEpOwp0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnZoKCk7dGhpcy5iLmpmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5qZigpO3RoaXMudGE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmdpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuVnEoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuY2coImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmdlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuR2QmJnRoaXMuYi5mLkFhKCkmJmUudihrLnljLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi4kYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5yYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuWHYoKSx0aGlzLmIuJGIoITApLCF0aGlzLk9iKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsCmNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLiRiKCEwKSx0aGlzLmV3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN3KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR3KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZncoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuYncoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubGkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9CmEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlViKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmtnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5aYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuYmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT0KYS5kYXRhLm5hbWUmJih0aGlzLkNmJiYodGhpcy5CZj0hMSx0aGlzLmVjKCkpLHRoaXMuWnYoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnJiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpOwplLmdlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuZ2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuJGYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubWM9ITB9LFp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSk7dGhpcy5tYz0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLk9oKCk7ZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sZXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sY3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5rZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSl9LGR3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxidzpmdW5jdGlvbigpe3RoaXMud2YoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxsaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm5lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSwKV3Y6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmd3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5saSghMCl9LFFuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5GYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5Sdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LApXaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sVG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxBZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5oaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxoaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMueWYoYSl9LmJpbmQodGhpcyksdGhpcy5JbykpfSx5ZjpmdW5jdGlvbihhKXtpZighdGhpcy5ZYyYmdGhpcy5XaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLlZiKXt0aGlzLlljPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5BZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnNnfHwKdGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuT3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5qZigpO3RoaXMuTnYoKTt0aGlzLmdpKCk7dGhpcy5kZygpO3RoaXMuYi52aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5tZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLmVkfHx0aGlzLlFmKCl9LFFmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZWR8fChhP3RoaXMuUmEoKToodGhpcy5QZSghMCksdGhpcy5RZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0uYmluZCh0aGlzKTt0aGlzLndlKCkuSmgodGhpcyl9LHdmOmZ1bmN0aW9uKCl7dGhpcy5MLmpiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkpuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxNbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkdnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuSnUoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlFkJiZ0aGlzLk1uKHRoaXMuYy5RZCk7CmlmKCF0aGlzLm9lKWlmKHRoaXMub2U9ITAsdGhpcy5QZHx8KGUudihrLkpzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucGMpe2Uub2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMubGYrKzt0aGlzLlZiPXRoaXMuWWM9ITE7dHJ5e3RoaXMuQWQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkVkPSExO3RyeXt0aGlzLmIuZGkoKX1jYXRjaChnKXt9dGhpcy5HZD0hMDt0aGlzLmIuQWUoKTt0aGlzLmFjPSExO3RoaXMud2UoKS5FaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5RZSgpO3RoaXMuYy5wYyYmKGE/dGhpcy5jLm9yaWdpbi5waCgpOnRoaXMucGUoKSl9ZWxzZSB0aGlzLnBlKCl9LApSdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMueGYoYSkpfSx4ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5icCgpO3RoaXMuYy5vcmlnaW4udGcody5UZCl9LGlpOmZ1bmN0aW9uKCl7aWYodGhpcy5udil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5HZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsueWMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnJ2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlBkPSEwO2UudihrLmppLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkZlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmtmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1oKSkmJihjPXRoaXMuYy5rZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuRWR8fCh0aGlzLkVkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLldmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLlZiPXRoaXMuWWM9ITEsdGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkVkPSExLHRoaXMuYi5kaSgpLHRoaXMuYy5vcmlnaW4uUWUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5XYy5yZXBsYWNlKCJbdGltZV0iLGUuQmcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5lZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGFpOmZ1bmN0aW9uKCl7dGhpcy51aHx8KHRoaXMudWg9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2UudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5iaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmFpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5haSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLk9oKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwuamImJgp0aGlzLllhKCJzdGFydCIpLGUudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlBmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKgp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmJpPWEpfSxOaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sTHU6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LE9oOmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxNdTpmdW5jdGlvbigpe2UuS2QoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLktkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5BZnx8dGhpcy5MLmpiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmpiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMudmQmJnRoaXMudmQudHJhY2smJnRoaXMudmQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuVHEodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5qZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkZkLmltcHJlc3Npb25zJiYKZS5McihnLnVybCx0aGlzLkZkLmltcHJlc3Npb25zKT90aGlzLkplKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Lbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5GZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSmUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnlwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5BZiYmKGI9Il92cGFpZCIpO3RoaXMuQ2YmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sSmU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5QbihjKSxmfHwKKGY9dGhpcy5yZyksZXx8KGU9dGhpcy5yZyksdGhpcy5SbihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LERoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LG5wOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sT3U6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuY2NbYl0mJmErKztyZXR1cm4gYX0sVHE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx5cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLlB2LmJpbmQodGhpcykpfSxQdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sTnY6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuV2MucmVwbGFjZSgiW3RpbWVdIixlLkJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuJGMmJihiPXRoaXMuTC4kYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLAoxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZ2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnNwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLApmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlhoLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06CihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnF2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucHYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgoobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuTWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5rZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwKKHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksCmMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlBlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQmZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx3ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sR2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0scHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LHF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5yYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnJiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5yYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxQZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm1mKCkpfSxwZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmplJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnNofHwhdGhpcy5MLlJjJiYic3BpZWdlbC5kZSIhPWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5lZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm1nKCkpOih0aGlzLnNoPXRoaXMuQ2Y9dGhpcy5CZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmplPSEwLGE9ZS5jZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5LZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbWc6ZnVuY3Rpb24oYSl7dGhpcy5PdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoITApfS5iaW5kKHRoaXMpLHRoaXMuZ3QpOih0aGlzLkdkPSEwLHRoaXMuYi5BZSgpLHRoaXMuYi5idSgpLHRoaXMuYWM9ITEsCmUudihrLnJwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy53ZSgpLkVoKCkpfSx3ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkVlKHRoaXMudmlkZW8sYSk/dGhpcy5HaCgpOnRoaXMud2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5VYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnJjJiYwPHRoaXMucmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnJjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5MbysiLSIrdGhpcy5sZjt0aGlzLmMmJnRoaXMuYy5IZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSGcoKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ma3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGo9dGhpcy5hWzVdO3RoaXMua289dGhpcy5hWzJdO3RoaXMuUnM9dGhpcy5hWzhdO3RoaXMubHc9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy50bj1iO2IucHJvdG90eXBlPXtzajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGo6dGhpcy5qbyhhKX0sam86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmtvOgp0aGlzLlFzKGEpfSxRczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnM6dGhpcy5rdyhhKX0sa3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmx3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy50bnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuc2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLmhzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLlNtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmhkKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5EYShiLHRoaXMuZ3MuYmluZCh0aGlzKSx0aGlzLmRzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5RcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5WdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxRcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuTHQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9CnRoaXMuRGcoKTt0aGlzLnNjPXRoaXMucGYoKTt0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEucmVzcG9uc2VVUkw7dGhpcy5ZLmxlbmd0aD90aGlzLkljKCk6dGhpcy5zYSh0aGlzLlNhKHcuUGMse2Vycm9yOnRoaXMuemY/Ry5XZDpHLklmfSkpfSxoczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpO3RoaXMucWM9dGhpcy5UaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sZHM6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5IZix7ZGVwdGg6YX0pKX0sSWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5TcigpP3RoaXMuZXYoKT8oYSsrLApuZXcgYih0aGlzLHRoaXMuTWcoKSxoLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMuc2EodGhpcy5TYSh3LktmKSk6KGE9MCx0aGlzLkR2KCkmJnRoaXMuVmUodGhpcy53cCgpKSl9LFFlOmZ1bmN0aW9uKCl7dGhpcy5zYz8odGhpcy5zYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5RZSgpfSxwaDpmdW5jdGlvbigpe3RoaXMucWM/KHRoaXMucWM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQucGgoKX0sRHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idigpP3RoaXMuYXYoKT8hMDooLTEhPXRoaXMuQ2MoKT90aGlzLnNhKHRoaXMuU2Eody5TZCkpOnRoaXMuc2EodGhpcy5TYSh3LkRmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5QYyxHLkpmKSksITEpfSxWZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5RZHx8KGEuUWQ9CltdKTthLlFkLnB1c2godGhpcy5TZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk1lKCkpO2EudGI9YS50Yj9hLnRiOnRoaXMuc2M7YS5wYz1hLnBjP2EucGM6dGhpcy5xYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5wYXJlbnQuVmUoYSl9LHdwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuQ2MoKTthLk89dGhpcy5KZygpO2EuVWI9dGhpcy5EcSgpO2EuS3Y9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5BcSgpO2Eua2Y9dGhpcy5ScShhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLnpnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT13LlNkLmNvZGU/Yi5QYS5jb25jYXQodGhpcy5FcSgpKTpiLlBhLmNvbmNhdCh0aGlzLk1xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuV2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sZXY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxidjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuSmcoKS5sZW5ndGh9LAphdjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQ2MoKX0scGY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxUaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucGYoKSYmKGE9ITApO3JldHVybiBhfSxMdDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk1nKCkubGVuZ3RofSxNZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwKIlZBU1RBZFRhZ1VSSSIpfSxCcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwiQWRTeXN0ZW0iKX0sTWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy4kZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LCRnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuJGcoYS5wYXJlbnROb2RlKToKITF9LE1xOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxEcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxKZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSwKang6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsCmM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMubmQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LENjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxScTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd1KGQsYSksMD5iJiYKKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLlNtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllrPXRoaXMuYVszXTt0aGlzLk1zPQp0aGlzLmFbN107dGhpcy5rcD10aGlzLmFbMTBdO3RoaXMuWm49dGhpcy5hWzddO3RoaXMucHQ9dGhpcy5hWzVdO3RoaXMuVXU9dGhpcy5hWzhdO3RoaXMueHY9dGhpcy5hWzEwXTt0aGlzLnlrPXRoaXMuYVs3XTt0aGlzLmh2PXRoaXMuYVs4XTt0aGlzLnZpPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuWXA9YjtiLnByb3RvdHlwZT17WGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zazp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTXM6dGhpcy5qcChhKX0sanA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtwOnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abjp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucHQ6dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV1OnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy54djoKdGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlrOnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5odjp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLllwfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Yayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlViPSIiO3RoaXMuQj10aGlzLnBjPXRoaXMudGI9ITE7dGhpcy5CZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuQ2U9IiJ9Yy5SbD1iO2IucHJvdG90eXBlPXtvcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSwKYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxLcTpmdW5jdGlvbigpe2lmKCF0aGlzLkJlJiYKdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkdhKXt2YXIgYT10aGlzLm9yaWdpbi5HYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkJlPWFbY10pfXJldHVybiB0aGlzLkJlfSxIZzpmdW5jdGlvbigpe2lmKHRoaXMuQ2UpcmV0dXJuIHRoaXMuQ2U7dmFyIGE9IiI7KGE9dGhpcy5LcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuQ2U9YX0sVnE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLlJsfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuaW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMV19Yy5pdD1iO2IucHJvdG90eXBlPXtobzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLml0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5obyg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LERmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxQYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCk9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEx3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSWk9dGhpcy5hWzldO3RoaXMuQXc9dGhpcy5hWzEwXTt0aGlzLnlyPXRoaXMuYVsyXTt0aGlzLkFyPXRoaXMuYVsxXTt0aGlzLnZ3PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuSXA9YjtiLnByb3RvdHlwZT17SGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklpOnRoaXMuencoYSl9LHp3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bdzp0aGlzLnhyKGEpfSx4cjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXI6dGhpcy56cihhKX0senI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Bcjp0aGlzLnV3KGEpfSx1dzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLklwfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5IaSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmdkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuU2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlNqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zcj10aGlzLmFbMTBdO3RoaXMuVmk9dGhpcy5hWzFdO3RoaXMubG49dGhpcy5hWzRdO3RoaXMueHE9CnRoaXMuYVszXTt0aGlzLlVyPXRoaXMuYVs0XTt0aGlzLkN2PXRoaXMuYVsxXTt0aGlzLmpqPXRoaXMuYVs4XTt0aGlzLnltPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuenQ9YjtiLnByb3RvdHlwZT17WHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLllyOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5WaTp0aGlzLmtuKGEpfSxrbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubG46dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhxOnRoaXMuVHIoYSl9LFRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vcjp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy55bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLnp0fHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5Ycig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuRmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5OZD1bXTt0aGlzLkNoPVtdO3RoaXMuUmU9W107dGhpcy5Rdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMuWms9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5GaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZoW2FdLApjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLkV4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlp0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLlF0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz0KYztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuTmQucHVzaCh7c3JjOmMsZnJhbWU6ZyxodDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5SZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlJlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy5GcShhKSl9fSxGcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntOeDohMCxNeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntBeDoidmlkZW8iLFB4OiJqc0N1c3RvbSIsUXg6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxSeDoxLApreDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LFVxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5OZC5sZW5ndGg7YisrKWlmKHRoaXMuTmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5OZFtiXS5odDtyZXR1cm4iIn0sWnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkNoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlVxKGIpLHZlbmRvcjpifSk7dGhpcy5LdSgpfSxRdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuUXYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSwKYil9LmJpbmQodGhpcykpOnRoaXMuYWcoYSxiKX0sYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLlJlLnB1c2goe3R5cGU6YSxWbzpiLEt4OiExfSl9LEt1OmZ1bmN0aW9uKCl7dGhpcy5DaC5tYXAoZnVuY3Rpb24oYSl7YS5Pcnx8KGEuRHgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLk94LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Pcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5aa3x8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXU9dGhpcy5hWzldO3RoaXMub3c9dGhpcy5hWzhdO3RoaXMud3U9dGhpcy5hWzldO3RoaXMuc2w9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5vcj1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmV1OnRoaXMubncoYSl9LG53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vdzp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud3U6dGhpcy5ybChhKX0scmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnNsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5vcnx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuZHUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5pYj1hLkVnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmJnPSExO3RoaXMuVGI9W119Yy51aj1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnpxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5rcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDsKZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUnU6ZnVuY3Rpb24oKXt0aGlzLmJnPSEwfSxkaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5mLnMoKSl9LGJ1OmZ1bmN0aW9uKCl7dGhpcy5iZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZGQsdGhpcy5mLnMoKSkpfSxqZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5pYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5pYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTt0aGlzLmYuTGMmJnRoaXMuZi5MYygpP3RoaXMuZi5FZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LGtyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx0cTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249Yi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSwkYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRxKHRoaXMuaWIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQWUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkxjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9CmIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUuUGgodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy4kYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEFlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTsKZm9yKHZhciAkYT1jLnVqfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy4kcD10aGlzLmFbMV07dGhpcy5Cbz10aGlzLmFbNF07dGhpcy5NbD10aGlzLmFbNF07dGhpcy54bj10aGlzLmFbMV07dGhpcy5Ybj10aGlzLmFbNF07dGhpcy52dj0KdGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5pdz1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMub286dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRwOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cbzp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWw6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhuOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ybjp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudnY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5pd3x8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLm5vKDQpOyhmdW5jdGlvbihjKXtjLkRsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5CZChiKTt0aGlzLnBnKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKSl9LApwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxBYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkOwpiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGNiPWMuRGx8fGNiOyhmdW5jdGlvbihjKXtjLkNsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kYSgpO3RoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5UZj10aGlzLlZmPXRoaXMuV2c9dGhpcy5lYT10aGlzLnNmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuV2cmJnRoaXMuamcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmYS5hYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmJkKCk7dGhpcy5XZz0hMDt0aGlzLmpnKCl9LmJpbmQodGhpcykpO3RoaXMuZmcoKX0samc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5iZCgpO2lmKCF0aGlzLnNmJiYhdGhpcy5iZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuc2YmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LApLZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxmZzpmdW5jdGlvbigpe2lmKHRoaXMuYmQoKSl7dmFyIGI9dGhpcy5LZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9Yi5oeH10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LGx4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLnl4KCk6ITF9LENjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/CmIuQ2MoKTotMX0sTnE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLlNiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5EZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLk5xKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBkYj1jLkNsfHxkYjsoZnVuY3Rpb24oYyl7Yy5FbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFByOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlZsLkFuLnluP3dpbmRvdy5PTy5WbC5Bbi55bi5meChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnhlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYywKdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBlYj1jLkVsfHxlYixmYj1uZXcgZWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXA9dGhpcy5hWzhdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuYWo9dGhpcy5hWzFdO3RoaXMuZHI9dGhpcy5hWzRdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMuaHI9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzhdO3RoaXMucGs9dGhpcy5hWzNdO3RoaXMuR2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbN119Yy5GcD1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuJGkoYSl9LCRpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5hajp0aGlzLmNyKGEpfSxjcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhPwp0aGlzLmRyOnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kbjp0aGlzLmdyKGEpfSxncjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaHI6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnVyOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wazp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5GcHx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuRHAoNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk5nKCl9LApOZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy55aCgpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuZmp8fGhiOyhmdW5jdGlvbihjKXtjLmVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSwKdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmdnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2coYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuZWp8fGliOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCkJoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zcXx8KHRoaXMuc3E9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkJoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5CaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuZ2p8fGpiLFQ9bmV3IGpiKHIpO1QuZygpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xbD10aGlzLmFbOF07dGhpcy5zcj10aGlzLmFbNV07dGhpcy5JdT10aGlzLmFbMTBdO3RoaXMuY289dGhpcy5hWzldO3RoaXMuRnc9dGhpcy5hWzhdO3RoaXMuR209dGhpcy5hWzhdO3RoaXMuQ2o9dGhpcy5hWzhdO3RoaXMuam49dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMV19Yy50cD1iO2IucHJvdG90eXBlPXtwbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWw6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNyOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JdTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY286dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZ3OnRoaXMuRm0oYSl9LEZtOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuR206dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMudHB8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnBsKDQpOyhmdW5jdGlvbihjKXtjLnJtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ybXx8VTsoZnVuY3Rpb24oYyl7Yy5xbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIisKYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guVmMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5OcyhhKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5acSgpfSxOczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7CnJldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn19dGhpcy51KCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMucW18fFY7KGZ1bmN0aW9uKGMpe2Muc209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUuQnAoYix0aGlzLnVkKSk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMudWR8fCh0aGlzLnVkPVtdKSx0aGlzLnVkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSwKZnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5IY3x8KHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChiKSx0aGlzLmF1KCkmJih0aGlzLmJmKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LFpxOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGI9MDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPQowO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LmZ2KGIpfX0pfSkoYyk7dmFyIGxiPWMuc218fGxiLHg9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWo9dGhpcy5hWzhdO3RoaXMuU2k9dGhpcy5hWzJdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMuYnM9dGhpcy5hWzJdO3RoaXMuem89dGhpcy5hWzNdO3RoaXMuZXE9dGhpcy5hWzNdO3RoaXMuYW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNl19Yy5MbT1iO2IucHJvdG90eXBlPXt6ajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFqOnRoaXMuUmkoYSl9LApSaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU2k6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBvOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5iczp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem86dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVxOnRoaXMuJG4oYSl9LCRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1iPWMuTG18fG1iLE9jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLnpqKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7CnRoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LEFhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuYmp8fG5iOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLmNqfHxvYjsoZnVuY3Rpb24oYyl7Yy5kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTihnKXx8Cih0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLmRqfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzldO3RoaXMuQWs9dGhpcy5hWzldO3RoaXMuS2o9dGhpcy5hWzJdO3RoaXMuZnI9dGhpcy5hWzRdO3RoaXMuUWs9dGhpcy5hWzEwXTt0aGlzLndqPXRoaXMuYVs1XTt0aGlzLmlxPXRoaXMuYVs5XTt0aGlzLkN3PXRoaXMuYVszXTt0aGlzLkl0PXRoaXMuYVsxMF07dGhpcy5WcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX0KYy5Xbz1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ0OnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuS2o6dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZyOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Razp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2o6dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pcTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3c6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkl0OnRoaXMuVXAoYSl9LFVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5Xb3x8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuZXQoNCk7KGZ1bmN0aW9uKGMpe2MudWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuUHQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sUHQ6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiYKdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFhnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMudWx8fHNiOyhmdW5jdGlvbihjKXtjLnRsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5taT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5taSYmKHRoaXMuRygpLHRoaXMubWk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnRsfHx0YjsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBiPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy52bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLnhpPXRoaXMuYVsxXTt0aGlzLnZxPXRoaXMuYVszXTt0aGlzLndyPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuU3M9YjtiLnByb3RvdHlwZT17ZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVrOnRoaXMud2koYSl9LAp3aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGk6dGhpcy51cShhKX0sdXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZxOnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy53cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuU3N8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmRrKDQpOyhmdW5jdGlvbihjKXtjLlltPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7CnZhciB3Yj1jLlltfHx3YjsoZnVuY3Rpb24oYyl7Yy5YbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxYYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sTnQ6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy50Yz0KITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5OdCh0aGlzLkNhKToodGhpcy5DYT10aGlzLlhiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpO3JldHVybn1pZighdGhpcy50Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTsKZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLlhtfHx4YjsoZnVuY3Rpb24oYyl7Yy5abT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuWm18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudnA9dGhpcy5hWzVdO3RoaXMuUG09dGhpcy5hWzEwXTt0aGlzLnBzPXRoaXMuYVs2XTt0aGlzLmRsPXRoaXMuYVszXTt0aGlzLk1pPXRoaXMuYVsyXTt0aGlzLkNpPXRoaXMuYVs5XTt0aGlzLmFtPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVsyXTt0aGlzLnFvPXRoaXMuYVszXTt0aGlzLm9sPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuWnI9YjtiLnByb3RvdHlwZT17dXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZwOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QbTp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucHM6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NaTp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ2k6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5hbTp0aGlzLnptKGEpfSx6bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQW06dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFvOnRoaXMubmwoYSl9LG5sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuWnJ8fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLnVwKDQpOyhmdW5jdGlvbihjKXtjLmNtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5XZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucnQoKX0uYmluZCh0aGlzKSw1MDApfSxydDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLldlJiYKd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LE51OmZ1bmN0aW9uKCl7dGhpcy5XZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuY218fEJiOyhmdW5jdGlvbihjKXtjLmJtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ucz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMua2N8fCh0aGlzLmtjPQowLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5ucz8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuTnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLmJtfHxDYjsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuZG18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bj10aGlzLmFbM107dGhpcy5qbT10aGlzLmFbNl07CnRoaXMuU2s9dGhpcy5hWzNdO3RoaXMuQ3I9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5XbD1iO2IucHJvdG90eXBlPXt1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5pbShhKX0saW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmptOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tazp0aGlzLkJyKGEpfSxCcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLldsfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1TYy51big0KTsoZnVuY3Rpb24oYyl7Yy5ZbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5ZbHx8R2I7KGZ1bmN0aW9uKGMpe2MuWGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuS2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnBwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMubWQoKTsKMDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy4kcigpOnRoaXMuaWcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxwcDpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5tKCEwKX0sJHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7IWIucWEmJmIuWSYmYi5leCYmYi5neCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGlnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PQpiPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCl9LmJpbmQodGhpcyksMTAwKX0sbWQ6ZnVuY3Rpb24oKXtpZighdGhpcy50aClmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuS2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudGg9YltjXSk7cmV0dXJuIHRoaXMudGh9LHp4OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLm1kKCkuYWRzTG9hZGVyP3RoaXMuRyghMCk6dGhpcy5HKCk6dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBIYj1jLlhsfHxIYjsoZnVuY3Rpb24oYyl7Yy5abD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgSGIoYyx0aGlzLkkpKS5nKCkpfXJldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgSWI9Yy5abHx8SWIsSmI9bmV3IEliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBxPXRoaXMuYVsxMF07dGhpcy5xcj10aGlzLmFbN107dGhpcy5PbD10aGlzLmFbMTBdO3RoaXMuRXQ9dGhpcy5hWzhdOwp0aGlzLnR3PXRoaXMuYVsxMF07dGhpcy50dj10aGlzLmFbOF07dGhpcy5CbD10aGlzLmFbM107dGhpcy5saj10aGlzLmFbM107dGhpcy5ubT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLnhwPWI7Yi5wcm90b3R5cGU9e29xOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wcTp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXI6dGhpcy5ObChhKX0sTmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9sOnRoaXMuRHQoYSl9LER0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5FdDp0aGlzLnN3KGEpfSxzdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHc6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR2OnRoaXMuQWwoYSl9LEFsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CbDp0aGlzLmtqKGEpfSxrajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGo6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMubm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnhwfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5vcSg0KTsoZnVuY3Rpb24oYyl7Yy5Waz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7SCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlcoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LAp4eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Wa3x8WDsoZnVuY3Rpb24oYyl7Yy5Vaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhlPWIuaWQpO0g/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGUmJmIhPXRoaXMuWGV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmCiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkZ4KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy51KCJhZGVycm9yIiksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFk9Yy5Va3x8WTsoZnVuY3Rpb24oYyl7Yy5Xaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/CiExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWChiKSxiLm5hP3RoaXMuYmYoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEgsTGI9Yy5Xa3x8TGIsTWI9bmV3IExiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jaj10aGlzLmFbMTBdO3RoaXMuWmk9dGhpcy5hWzRdOwp0aGlzLmJxPXRoaXMuYVs2XTt0aGlzLmdsPXRoaXMuYVszXTt0aGlzLllxPXRoaXMuYVs4XTt0aGlzLm5qPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3M9YjtiLnByb3RvdHlwZT17SGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLklqOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5aaTp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnE6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmdsOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ZcTp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLktzfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuSGooNCk7KGZ1bmN0aW9uKGMpe2MuYWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSxhJiZjPyh0aGlzLlcoYyksdGhpcy5aKGEpKTp0aGlzLmNhKCkpOnRoaXMuY2EoKTp0aGlzLmNhKCk6dGhpcy5jYSgpfSxmdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LEN4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuYWt8fE9iOyhmdW5jdGlvbihjKXtjLiRqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpezEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IiwKZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMub2EoKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIFBiPWMuJGp8fFBiOyhmdW5jdGlvbihjKXtjLmJrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7Ynx8KGI9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYiYmYi5HZXRBbGxQbGF5ZXJzJiYoYj1iLkdldEFsbFBsYXllcnMoKSkmJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm5hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5ia3x8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5SbT10aGlzLmFbNF07dGhpcy55dT10aGlzLmFbNF07dGhpcy50cz10aGlzLmFbMl07dGhpcy55aj10aGlzLmFbM107dGhpcy5Fcz10aGlzLmFbOF07dGhpcy5IcD10aGlzLmFbM107dGhpcy5qcj10aGlzLmFbNl07dGhpcy54bz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsyXX1jLnRtPWI7Yi5wcm90b3R5cGU9e1FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5SbTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXU6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRzOnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55ajp0aGlzLkRzKGEpfSxEczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRXM6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhwOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuanI6dGhpcy53byhhKX0sd286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy50bXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuUW0oNCk7KGZ1bmN0aW9uKGMpe2MuZm49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuVyhhKX1lbHNlIHRoaXMuY2EoKX0sCkxkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxPdDpmdW5jdGlvbigpe3RoaXMuUmQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuUmQ9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX19LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLmZufHxUYjsoZnVuY3Rpb24oYyl7Yy5lbj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxTdDpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksCmIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSl9LGFkOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpOwphLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sTmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0wO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuYWQod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk5mLmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuU3Qod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5OZigpO3RoaXMuUnQoKX0sUnQ6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLAp0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oKXt9KX0sbTpmdW5jdGlvbihiKXt0aGlzLk10P3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbigpe3RoaXMuTXQ9ITB9fSl9KShjKTt2YXIgVWI9Yy5lbnx8VWI7KGZ1bmN0aW9uKGMpe2MuZ249dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5PdCgpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7CnZhciBWYj1jLmdufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLkFwPXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzZdfWMud209YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5tOnRoaXMuenAoYSl9LHpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5BcDp0aGlzLnFqKGEpfSxxajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLndtfHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy5NbSg0KTsKKGZ1bmN0aW9uKGMpe2MuSW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy53aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLkNzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxmdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLAphPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMud2gmJih0aGlzLndoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy5JbXx8TzsoZnVuY3Rpb24oYyl7Yy5IbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnJ1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKaGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLkhtfHxQOyhmdW5jdGlvbihjKXtjLkptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuYmYoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLkptfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9CnRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuY2s9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkd0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5ja3x8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnQoNCk7KGZ1bmN0aW9uKGMpe2MuTms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Naz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuYmgoKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnFiKCksITA7dGhpcy5UZysrO2lmKDEwPAp0aGlzLlRnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmguYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PQp0eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPwoodGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLk1rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Paz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsCnRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLk9rfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHY9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbN119Yy5rbD1iO2IucHJvdG90eXBlPXtrdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLmtsfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMua3YoNCk7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaGcoKX0sCmhnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5Xanx8ZWM7KGZ1bmN0aW9uKGMpe2MuWWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz0KbmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmx0PXRoaXMuYVs0XTt0aGlzLk1wPXRoaXMuYVsyXTt0aGlzLldzPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzVdfWMuVG09YjtiLnByb3RvdHlwZT17a3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmx0OnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NcDp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLldzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuVG18fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmt0KDQpOyhmdW5jdGlvbihjKXtjLnBpPQpwLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5waXx8aWM7KGZ1bmN0aW9uKGMpe2Mub2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMub2l8fGpjOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj0KbmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMucml8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56bD10aGlzLmFbN107dGhpcy56aT10aGlzLmFbOV07dGhpcy5ubj10aGlzLmFbMTBdO3RoaXMuQXU9dGhpcy5hWzFdO3RoaXMuWHA9dGhpcy5hWzFdO3RoaXMucW49CnRoaXMuYVsyXTt0aGlzLlFpPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbNV07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5XaT1iO2IucHJvdG90eXBlPXt5bDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpsOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56aTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubm46dGhpcy56dShhKX0senU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF1OnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5YcDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucW46dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFpOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Zczp0aGlzLnFrKGEpfSxxazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucms6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5XaXx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMueWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZWg9dGhpcy5naD10aGlzLmZoPSExO3RoaXMueGQ9W107dGhpcy5hZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYj8KbnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBFYj9udWxsOkViLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgemI/bnVsbDp6YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBsYz8KbnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuVGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5PcShhKTpbXSxiO3RoaXMuZ2g9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZmg9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuSGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmFmKXtpZih0aGlzLmVoKWJyZWFrO2I9dGhpcy5hZltjXTt0aGlzLnZmKGIpJiYodGhpcy54ZC5wdXNoKGIpLHRoaXMuSGgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxPcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSwKUHU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmZoKWZvcih0aGlzLmVoPSEwLGE9MDthPHRoaXMueGQubGVuZ3RoO2ErKyl0aGlzLnhkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGRbYV0uTGIpfX19KShjKTt2YXIgbmM9Yy5UbHx8bmMsTT1uZXcgbmM7TS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWW89dGhpcy5hWzldO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMucnc9dGhpcy5hWzFdO3RoaXMudm89dGhpcy5hWzEwXTt0aGlzLk12PXRoaXMuYVszXTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLlNvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzldfWMuS209YjtiLnByb3RvdHlwZT17WG86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLllvOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Obzp0aGlzLnF3KGEpfSwKcXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJ3OnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52bzp0aGlzLkx2KGEpfSxMdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk12OnRoaXMudXMoYSl9LHVzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52czp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYz1jLkttfHxvYyxhZD1uZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5Ybyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOgoiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQmMoay5FdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuQmMoay5JcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLApyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLllnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWWcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtJLmthKCk7dmFyIGNkPWJkKGZ1bmN0aW9uKCl7ZS55Zyh3aW5kb3csSS5FcigpLHtpZDpjZH0pfSw1MDApLGlhPWUuYWEoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenY9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMl19Yy5ibD1iO2IucHJvdG90eXBlPXt5djpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPWMuYmx8fHBjLGRkPW5ldyBwYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWRkLnl2KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy54aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMuc2Q9MDt0aGlzLmJiPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0saXU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxodTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oYSxiKXtlLmZhKCJ3ZWx0LmRlIikmJmUuYWIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5IcigpKXRoaXMubGIubCh0aGlzLmxiLm9kLHRoaXMubGIud2EsdGhpcy5sYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLkFjKTsKZWxzZSBpZih0aGlzLmFyKCkpdGhpcy5jdShmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudihrLnljLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3ICRhKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5SdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLm9iKCJuZXdIb21hZERpc3BsYXkiKTtSPWw9bmV3IFJhKGwsdGhpcy5sYixnKTtsLmd1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5tcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sCmcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuS2UoYSxjLGYpO3RoaXMucGxheWVyLkpoKGwpfX0sSHI6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxiPTA7aWYodGhpcy5zZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLnNkLmdldFRpbWUoKSx0aGlzLnNkPWEsM0U1PGI/ITA6ITE7dGhpcy5zZD1hO3JldHVybiExfSxFdTpmdW5jdGlvbigpe2Uub2IoInByZXJvbGwiKTtlLmZmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0sRHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7CmUub2IoInBvc3Ryb2xsIik7dGhpcy5udSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy51ZyhjKSk/dGhpcy5NYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxWdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnR1KHRoaXMuRHUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTsKaWYoIXRoaXMubWgpe3RoaXMubWg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuTWMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZGQsdGhpcy5wbGF5ZXIucygpKSl9fSxVdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLm11KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuRXUoKTt0aGlzLnBsYXllci5OZSYmdGhpcy5VdCgpO3RoaXMuVnQoKX0sV3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9CjA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMueWQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLkR3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy56ZD10aGlzLnlkLmxlbmd0aH0sYXI6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPHRoaXMuemQmJihhPSEwKTtyZXR1cm4gYX0sY3U6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLnh0LmJpbmQodGhpcykpfSx4dDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0sbXM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTsKcmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnNpfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFwPXRoaXMuYVsxXTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLlVzPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMuVGk9YjtiLnByb3RvdHlwZT17UHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFwOnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlRpfHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9ZWQuUHAoNCl9KS5jYWxsKGthZWNoYWVNQW9sYWVidVosa2FlY2hhZU1Bb2xhZWJ1Wik7Cg==
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 - Amazon.com, Inc., US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:44 GMT
Last-Modified
Sun, 06 Oct 2019 15:34:32 GMT
Server
AmazonS3
x-amz-request-id
380C59223C0C35BC
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
/yqITdzDQyT9vGLwg8156kGstqw55jFHfGbH7KyKutcbRLMZjG1RpgVuJHuZqKV+y/iZNj6HCAY=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 92E8
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=2791404797
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGthZWNoYWVNQW9sYWVidVo9a2FlY2hhZU1Bb2xhZWJ1Wnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5pdShtKTthLmh1KGwpO2EuV3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5xdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzldfWMuRnU9YjtiLnByb3RvdHlwZT17Rm46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkduOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LcDp0aGlzLkRtKGEpfSxEbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRW06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYT1jLkZ1fHxoYSxzYz1uZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRm4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuTmM9W107dGhpcy5uZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnd0LmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5SZz17fTt0aGlzLmRmPSExfWMuaGs9YjtiLnByb3RvdHlwZT17UXU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrdGhpcy5uYltiXSsiXyIpO3JldHVybiBhfSxZYjpmdW5jdGlvbigpe3RoaXMuZGZ8fCh0aGlzLmRmPWUuYWEoMTApKTtyZXR1cm4gdGhpcy5kZn0sb2I6ZnVuY3Rpb24oYSl7dGhpcy5uYlthXXx8KHRoaXMubmJbYV09MCk7dGhpcy5uYlthXSs9MTs1PHRoaXMubmJbYV0mJiF0aGlzLlJnW2FdJiYodGhpcy5SZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIiwKdGhpcy5RdSgpLCEwKSl9LG5lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFVuOmZ1bmN0aW9uKGEpe3RoaXMuYmEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx3dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy52dChhLmRhdGEpfSwKdnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmJhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lciYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxnZTpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxvZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkdnKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5qaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sR2c6ZnVuY3Rpb24oYSl7dmFyIGI9Cm5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFNuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMuemEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS55cShhKSlyZXR1cm47KGI9dGhpcy5vZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09CmF9fSx5cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSx3ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUnI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0seGU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxGZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PQp0eXBlb2YgZD9kOm51bGx9LFBoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTsKdmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTtxPWcuaGVpZ2h0Kmcud2lkdGg7ZD1nLndpZHRoO2Y9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEZlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWUoYS5lbCwKYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihiKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LEhiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSx6ZTpmdW5jdGlvbihhKXt2YXIgYj0KMCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LEtoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixxLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLG09MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2gocSk7c3dpdGNoKG4lCjQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eT1rO3U9bTtyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHEsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSwKdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHEsNSkrKG4meXxuJnV8eSZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChxLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2U9ZStxJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O209bSt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihtKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksCmY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHE+PjYsZz1xJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihxKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sTnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSwKaGQ6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxxPSExLGM9ITEsZT0hMSxnPSExLGs9ITEsbT0hMSxsPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlRiPyEwOiExfWNhdGNoKHUpe310cnl7cT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwKLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPXE7YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LGxyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LAokbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sVGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxmbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEpvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWGkoKXx8YS5oaigpfHxhLmxyKCl8fGEuRmwoKXx8YS4kbSgpfHxhLlRrKCl8fGEuZm0oKX19O3JldHVybiBudWxsIT1hLkpvKCl9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscT1hLmxlbmd0aDtmPHE7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sWmI6ZnVuY3Rpb24oYSl7YT10aGlzLnphKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sUXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy56YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LEJwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LEd1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5jaShiKSsiOiIrdGhpcy5jaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sY2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGZmOmZ1bmN0aW9uKGEpe3RoaXMuQ2I9YX0seWc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5DYjt0aGlzLmNlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7CmEuZGlzcGF0Y2hFdmVudChmKX0sQmM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLnlnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHEsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3EmJihCPWsuVGEoQixxKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuQmMoQil9LHl0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmIuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuUXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxKdTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuWWIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmNlKGEpfSxjZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnl0KGEpO2lmKGIpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bS5KYygpO20ueWEoYSwhMCk7YT1tLnlhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO20uRGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uSmMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwptLnlhKGYsITApO2Y9bS55YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkRhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sS2Q6ZnVuY3Rpb24oYSl7aWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bS5KYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1tLnlhKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO20uRGEoYSl9fSxMZTpmdW5jdGlvbigpe20mJm0uVj9tLmlzRW5hYmxlZCYmbS5jcCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sY2c6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkdlKGEpfHx0aGlzLlJyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guY2YmJndpbmRvdy5zYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMud2coYSkpcmV0dXJuIHRoaXMud2coYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYWIoYSxiLkxhLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnFkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLlNuKGUsYSk7cmV0dXJuIGV9LGFiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIGw9ZXx8bTtlPSEwO2smJihlPSExKTtpZihsJiZsLlYpaWYobC5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtsLnlhKGEsZSk7ZT1sLnlhKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtlLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHIgaW4gZCllLmRhdGFbcl09ZFtyXTtyZXR1cm4gbC5EYShlLGYsYywiIiwiIixnKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYSxiLGQsZixjLGwsZyxrKX0uYmluZCh0aGlzKSw1MDApfSxqaDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fAo0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxrKSxsLndpdGhDcmVkZW50aWFscz1lLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKHIpe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuamgoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuTmMpZm9yKHZhciBjIGluIHRoaXMuTmMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5OY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueGIoYSk7ZCYmCihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sa2g6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihhLGYuTGEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLmZzKGYucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LApxdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5OYz1hfSxEdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOgpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sS286ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LExyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLmhrfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT0KYXx8e319Yy5naz1iO2IuVGE9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLmp0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkhzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuanE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlhmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlBmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLAptZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuVWY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuWWY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLkpuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLlNmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuSnY9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkdzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmtxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IucHc9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iua2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ycD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuZGQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi55Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuV2Y9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkxuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuVWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLiRkPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLmJlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5Lbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iuamk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Kcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnRkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnRmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07CmIubGc9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkZ2PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRXY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Jcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7CnZhciBrPWMuZ2t8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzEwXTt0aGlzLnRvPXRoaXMuYVszXTt0aGlzLldyPXRoaXMuYVs1XTt0aGlzLmJ0PXRoaXMuYVsxMF07dGhpcy5Ebz10aGlzLmFbM107dGhpcy5Qcz10aGlzLmFbMTBdO3RoaXMuSG89dGhpcy5hWzddO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMuR2k9dGhpcy5hWzJdO3RoaXMuS2k9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5ScD1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSW46dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnRvOnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xcjp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnQ6dGhpcy5DbyhhKX0sQ286ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuRG86dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBzOnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ibzp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS3c6dGhpcy5GaShhKX0sRmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5HaTp0aGlzLkppKGEpfSxKaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2k6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLlJwfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Ibig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmlrPWI7Yi5wcm90b3R5cGU9e3plOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09CmEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LExxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LApsZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubGQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxFcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxZZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnplKHRoaXMuTHEoKSsiIiksCmE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaWt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMuT2k9dGhpcy5hWzVdO3RoaXMuRWk9dGhpcy5hWzhdO3RoaXMubnE9dGhpcy5hWzEwXTt0aGlzLmhtPXRoaXMuYVs0XTt0aGlzLkhrPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuR3c9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1sOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53azp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhPwp0aGlzLk9pOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRWk6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ucTp0aGlzLmdtKGEpfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaG06dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5Hd3x8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MubGwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsCmY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLm9qPWJ9KShjKTt2YXIgTD1jLm9qfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNuPXRoaXMuYVs3XTsKdGhpcy5Vbz10aGlzLmFbMl07dGhpcy5DdT10aGlzLmFbOF07dGhpcy54cz10aGlzLmFbNF07dGhpcy5Fbj10aGlzLmFbNl07dGhpcy5Gbz10aGlzLmFbMl07dGhpcy5Kaz10aGlzLmFbN107dGhpcy5hbD10aGlzLmFbNF07dGhpcy5PcD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs5XX1jLnJvPWI7Yi5wcm90b3R5cGU9e0JuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVW86dGhpcy5CdShhKX0sQnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN1OnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54czp0aGlzLkRuKGEpfSxEbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRW46dGhpcy5FbyhhKX0sRW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkZvOnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLiRrKGEpfSwKJGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFsOnRoaXMuTnAoYSl9LE5wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5PcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucm98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLkJuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuU2w9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5NYT17fTt0aGlzLkk9bnVsbDt0aGlzLktjPTEwMDt0aGlzLkliPTA7dGhpcy5XYT0xNTA7dGhpcy5MYj0wO3RoaXMuanUoYil9LGc6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhPyh0aGlzLkliKyssdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLktjKSk6CjA+dGhpcy5XYSYmKHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5LYykpfSxhdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkliPnRoaXMuV2E/ITA6ITF9LGJmOmZ1bmN0aW9uKCl7dGhpcy5JYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sanU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LEpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuUCgpLCEwKTt0aGlzLk1hW2IubGEoKV09YjtNJiZNLmdoJiZNLlB1KGIpfSxyeDpmdW5jdGlvbigpe3JldHVybiBlLnhlKHRoaXMuTWEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX0sTXI6ZnVuY3Rpb24oYil7Yj1iLkthKCk7Zm9yKHZhciBhIGluIHRoaXMuTWEpaWYoYi5pZD09CnRoaXMuTWFbYV0uS2EoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sSng6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5TbHx8dDsoZnVuY3Rpb24oYyl7Yy5VbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLktjPTEwO3RoaXMuSWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubmE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkJiPSIiO3RoaXMucWc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5LYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxNOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30sCnR1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSxzeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LG11OmZ1bmN0aW9uKGIpe3RoaXMuT2U9Yn0scXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZX0sTmU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhJiYodGhpcy5JYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuS2MpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpOwplbHNlIHJldHVybiExfWNhdGNoKGIpe319LEVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2EoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuYnIoKXx8dGhpcy5ObigpO3RoaXMuQmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSx0eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxObjpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5hYSgxMCkpfSxicjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sVzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj0KYn0sS2E6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmF9LGNhOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMH0sTGM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxJZTpmdW5jdGlvbigpe3JldHVybiExfSxKaDpmdW5jdGlvbihiKXt0aGlzLkJiPWJ9LHB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmJ9LEVoOmZ1bmN0aW9uKCl7dGhpcy5CYj1udWxsfSx2eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuQmImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLnFnfHwodGhpcy5xZz0hMCl9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLlVsfHxwOyhmdW5jdGlvbihjKXtjLnRpPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5JPXRoaXMucGxheWVyPSIiO3RoaXMuTGY9IjEiO3RoaXMuTWY9IjIiO3RoaXMuem49IjMiO3RoaXMuUWM9MDt0aGlzLm5oPQozMDt0aGlzLlJiPVtdO3RoaXMuZ2I9W107dGhpcy5vYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5aZj10aGlzLmZpPSExO3RoaXMuc3RhdHVzPXRoaXMuUWM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLmdmKGIpO3RoaXMua3UoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5maXx8KHRoaXMuZmk9ITAsZS5MZSgpKX0sU2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxEcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5rYSgpXXx8KHdpbmRvd1thLmthKCldPXt9KTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldfHwod2luZG93W2Eua2EoKV1bYi5sYSgpXT17fSx3aW5kb3dbYS5rYSgpXVtiLmxhKCldLmluaXRpYXRvcj0KZS5ZYigpKTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWWIoKV0/d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldKys6d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldPTF9LEpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLmhmKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMueGEoKSl7dGhpcy5EcigpO2lmKCF0aGlzLkpyKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmhmKCk7cmV0dXJufXRoaXMuaGYoKTt0aGlzLkkodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLlpoKCk7dGhpcy5aZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSx1OmZ1bmN0aW9uKGIsCmEpe3RoaXMueGEoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmdiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxaaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuZ2Ipe2Zvcih2YXIgaD0wO2g8dGhpcy5nYi5sZW5ndGg7aCsrKXRoaXMub2NbdGhpcy5nYltoXS5yZWFzb25dPT10aGlzLm9jW2JdJiZhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLHRoaXMub2NbdGhpcy5nYltoXS5yZWFzb25dPHRoaXMub2NbYl0mJihhPVtdLGEucHVzaCh0aGlzLmdiW2hdLmRldGFpbCksYj10aGlzLmdiW2hdLnJlYXNvbik7dGhpcy5vY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITAsYSl9fSx1eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlpmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZn0saGY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxydTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuem59LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5RY30sUmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTGZ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk1mfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5RY30sZ2Y6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxrdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxqczpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMudGl8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR0PXRoaXMuYVsyXTt0aGlzLiRzPXRoaXMuYVsxMF07dGhpcy55dz10aGlzLmFbN107dGhpcy5pbD10aGlzLmFbNl07dGhpcy5Naj10aGlzLmFbN107dGhpcy5Maz10aGlzLmFbMV07dGhpcy5mbz10aGlzLmFbNV07dGhpcy5ncT10aGlzLmFbOV07dGhpcy5tcD10aGlzLmFbOV07dGhpcy5udD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs5XX1jLm1rPWI7Yi5wcm90b3R5cGU9e2N0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kdDp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy54dyhhKX0seHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnl3OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pbDp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5LayhhKX0sS2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5Mazp0aGlzLmVvKGEpfSxlbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZm86dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdxOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5tcDp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLm1rfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5jdCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87CnRoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Uanx8b2E7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLmR4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7CmIuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuVWp8fHBhOyhmdW5jdGlvbihjKXtjLlZqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Wanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmJuPXRoaXMuYVsxXTt0aGlzLm5yPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuQXQ9YjtiLnByb3RvdHlwZT17dW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZtOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLmJuOnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubnI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkF0fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy51bSg0KTsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5xcD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5iYz0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5XKGIpfSwKeGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KSwKYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJgozMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyOwphLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Da3x8c2E7KGZ1bmN0aW9uKGMpe2MuQms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYKKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ29tcGxldGUiKTsKdGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnFwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTt0aGlzLlNlKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMudygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJnRoaXMuVGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy53KCksdGhpcy5yYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sanM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8odGhpcy5yZT50aGlzLnNlJiYoYj0hMSksdGhpcy5HKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSw1MCk6KGEudmcoKSxhLnhnKCksYS5iY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ca3x8dGE7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5HcSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLk1yKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sb3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sR3E6ZnVuY3Rpb24oKXt2YXIgYj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB1YT1jLkRrfHx1YSx2YT1uZXcgdWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFqPXRoaXMuYVsxXTt0aGlzLlR2PXRoaXMuYVs0XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5sbT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLmpsPWI7Yi5wcm90b3R5cGU9e1BqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Rajp0aGlzLlN2KGEpfSxTdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHY6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJzOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMuamx8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlBqKDQpOwooZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0KITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHhhPWMuVm18fHhhOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLkNhPXRoaXMuWGM9ITE7dGhpcy5BaD1lLkhiKDEwKTt0aGlzLmVpPSEwO3RoaXMudGM9dGhpcy5WZz0hMTt0aGlzLkZzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5xaCgpLHRoaXMuWm8oKSx0aGlzLnFiKCkpfSxGczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmNvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLAoiOyIsYi5KP2IuSi5xYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaGU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5oZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkFoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJgoodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxYYjpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSWc6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSwKS3I6ZnVuY3Rpb24oKXtpZighdGhpcy5VZyl7dmFyIGI9dGhpcy55YigpLGE9dGhpcy5JcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVWc9ITApfXJldHVybiB0aGlzLlVnfSxJcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuWGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlhjPSEwKTtyZXR1cm4gdGhpcy5YY30scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLlR0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sVHQ6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuSWcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudWM9ITA7aWYoZS5mYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLnVjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxueDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMubmcmJmIuYWRzJiYodGhpcy5uZz1iLmFkcyk7cmV0dXJuIHRoaXMubmd9LFpvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdhKCEwKTt0aGlzLnUoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5TZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPQohMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLklnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0scWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuS3IoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpOwp0aGlzLnliKCl9ZWxzZSB0aGlzLlZnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpLGI9dGhpcy5YYigpO2EmJiFiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZ2EoKSk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlZnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPQphLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LCRvOmZ1bmN0aW9uKCl7dGhpcy56Y3x8KHRoaXMuemM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnpjIT0KYi5hZHMuc3RhdGUmJih0aGlzLnpjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuemM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRvKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpezA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5laT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5HKHRoaXMuZWksZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGhwOmZ1bmN0aW9uKCl7dGhpcy53eHx8KDEwPHRoaXMuVXY/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5VdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLiR0KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhwKCl9LmJpbmQodGhpcyksNTApKSl9LCR0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlZ2KXt0aGlzLlZ2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciB5YT1jLlVtfHx5YTsoZnVuY3Rpb24oYyl7Yy5XbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5RaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUWgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS54ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwKKG5ldyB5YShhLHRoaXMuSSkpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxUOmZ1bmN0aW9uKCl7dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLktjKX19KX0pKGMpO3ZhciB6YT1jLldtfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGw9dGhpcy5hWzEwXTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm5rPWI7Yi5wcm90b3R5cGU9e0dsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5IbDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLm5rfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuR2woNCk7KGZ1bmN0aW9uKGMpe2MuSmw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5VZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7CmQmJmEmJmEuYWMmJigwPD1oLmluZGV4T2YoZCl8fGEud2QoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlVlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlVlKys7aWYoMTA8dGhpcy5VZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuSmx8fENhOyhmdW5jdGlvbihjKXtjLklsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8Cih0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudGU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5xcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLnFxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucXQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuSWx8fERhOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLktsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXc9dGhpcy5hWzVdO3RoaXMuanY9dGhpcy5hWzNdO3RoaXMuc249dGhpcy5hWzFdO3RoaXMuenM9dGhpcy5hWzddO3RoaXMubW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy5BaT1iO2IucHJvdG90eXBlPXtIdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXc6dGhpcy5pdihhKX0saXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmp2OnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zbjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenM6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9CmMuQWl8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLkh3KDQpOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkZnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMudXQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy51dCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxncDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCkllOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy50a3x8SGE7KGZ1bmN0aW9uKGMpe2Muc2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMuc2t8fElhOyhmdW5jdGlvbihjKXtjLnVrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLnVrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRms9dGhpcy5hWzhdO3RoaXMudHQ9dGhpcy5hWzhdO3RoaXMuT2o9dGhpcy5hWzNdO3RoaXMuUWw9dGhpcy5hWzVdO3RoaXMuR3I9dGhpcy5hWzJdO3RoaXMubHM9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5Saj1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRms6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnR0OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Pajp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWw6dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdyOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMubHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYT1jLlJqfHxMYSxEYz1uZXcgTGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuams9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sbHU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxQbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmprfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmgsZCxmKXt0aGlzLmZiPWE7dGhpcy5BZz10aGlzLm5pPSExO3RoaXMucmg9ZDt0aGlzLlJoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLmZiPW5ldyB6KGEpKTt2YXIgYz10aGlzLnNiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkhlKHRoaXMuZmIudXJsKSYmbS5NZCl7dmFyIGU9bmV3IHooYS51cmwpO2UubHUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uaWEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5raz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5mYi5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5BZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuUmg/dGhpcy5zYi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCExKTp0aGlzLnNiLm9wZW4odGhpcy5mYi5tZXRob2QsdGhpcy5mYi51cmwsITApLHRoaXMubml8fCh0aGlzLnNiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5zYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuc2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuc2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkhlKHRoaXMuZmIudXJsKT9tLk1kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSGUodGhpcy5mYi51cmwpLHRoaXMucmgmJnRoaXMucmgoKX1yZXR1cm4gdGhpcy5zYn19fSkoYyk7dmFyIE1hPWMua2t8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLlZkPSExfWMucGo9YjtiLnByb3RvdHlwZT17cHU6ZnVuY3Rpb24oYSl7dGhpcy5WZD1hfSxvdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LFl0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e053OiJBZENsaWNrVGhydSIsUHc6IkFkRXJyb3IiLFF3OiJBZFN0b3BwZWQiLFR3OiJBZExpbmVhckNoYW5nZSIsVXc6IkFkVGFnUGFyc2VkIixYdzoiQWRWaWRlb0NvbXBsZXRlIiwkdzoiQWRMb2FkZWQiLGF4OiJBZFNraXBwZWQiLGJ4OiJBZFN0YXJ0ZWQiLFJ3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsU3c6IkFkSW1wcmVzc2lvbiIsT3c6IkFkQ3JlYXRpdmVWaWV3IixWdzoiQWRWaWRlb01pZHBvaW50IixXdzoiQWRQYXVzZWQiLFl3OiJBZFZpZGVvU3RhcnQiLFp3OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuVmQsYltkXSl9LFh0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVWQpZm9yKHZhciBiIGluIHRoaXMuSGEuVWQpdGhpcy5IYS5VZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVWRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuVmQmJnRoaXMuWXQoKTt0aGlzLkhhJiZ0aGlzLlh0KCl9fX0pKGMpO3ZhciBOYT1jLnBqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmllPQp0aGlzLnZjPXRoaXMud2I9bnVsbDt0aGlzLkNwPXRoaXMuSmI9dGhpcy5paD0hMTt0aGlzLkxhPSIiO3RoaXMuZGg9ITE7dGhpcy53YT10aGlzLm9kPSIiO3RoaXMuWmc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuJGU9ITE7dGhpcy5wYT1bXTt0aGlzLk9nPXRoaXMuZmM9IiI7dGhpcy5xZT0hMTt0aGlzLnFmPTA7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuSWQ9W107dGhpcy5nYz0iIjt0aGlzLnJmPTA7dGhpcy52aWRlb3BsYXphPQp7fTt0aGlzLkRjPSExO3RoaXMuaXA9dGhpcy5PZD1udWxsO3RoaXMuTGg9dGhpcy5sYz10aGlzLnNnPXRoaXMudWY9dGhpcy5NZD10aGlzLmtlPXRoaXMuUmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5wZD0wO3RoaXMuUWc9ITE7dGhpcy5QZz0xRTM7dGhpcy5aYz0hMTt0aGlzLlFhPTFFMzt0aGlzLk9mPSIifWMubGs9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy53YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLnZjLGFkdGFncmVnZXg6dGhpcy5pZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5paCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5DcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmRoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLndhLAppc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuWmcsc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZmMsaG9tYWRBZHBhdGg6dGhpcy5PZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnFmLEhPTUFEX1ZFUklGSUVEOnRoaXMuR2YsSE9NQURfQkxPQ0tFRDp0aGlzLkVmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm5jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5GZix0ZXN0SGlkZTp0aGlzLmhjLHRlc3RUYWdzOnRoaXMuaWMsdGVzdFRhZ3NKUzp0aGlzLmpjLHRlc3RUYWdzWEhSOnRoaXMuSWQsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMucmYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmlwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUmMsCmJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5rZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5NZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy51Zixjb25maWdGYWlsdXJlczp0aGlzLmhiLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLkloLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5qYix2cGFpZDp0aGlzLmxjLHNraXBBbGxvd2VkOnRoaXMuTGgsdm1hcHM6dGhpcy5raSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuWmMsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sJHE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmKGE9ITApO3JldHVybiBhfSxlZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSxIcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2JdJiYxPT10aGlzLmhiW2JdJiZhLnB1c2goYik7CnJldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLktvKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuR2UoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuRmMoKT9lPWE6ZT1jLnByb3RvY29sKwoiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLkpjKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMud2N8fHRoaXMud2J8fHRoaXMudmN8fHRoaXMuaWUpJiYoZz10aGlzLnJzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuSXEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxHZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT8KYj0hMDp0aGlzLkZjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxGYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5HZShhKTtyZXR1cm4gYn0sSXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PQp0eXBlb2YgdGhpcy5MYSYmMDx0aGlzLkxhLmxlbmd0aClyZXR1cm4gdGhpcy5MYTtmb3IoZCBpbiB0aGlzLkxhKWlmKGI9dGhpcy5MYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLml4O3JldHVybiJub25lIn0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLkloXX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnFkKCksYj10aGlzLktoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LG9oOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LHFzOmZ1bmN0aW9uKGEsCmIpe3ZhciBkPWUuemEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLm9oKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5vaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LHJzOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJgooYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy52YyYmKGE9dGhpcy5xcyhhLHRoaXMudmMpKTtyZXR1cm4gYX0sZnA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuYXAodGhpcy5GYS5jbGllbnRBUElzKX0sYXA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLnB1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5vdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5kaD0hMDt0aGlzLm9kPWE7dGhpcy53YT1iO3RoaXMuJGU9ZDt0aGlzLk9kPWY7dGhpcy5BYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5mcCgpO3RoaXMuZXMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5jcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLndhKXRyeXt0aGlzLndhPWIsdGhpcy54YygpfWNhdGNoKGspe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9fSxwYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sZXM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMub2QrdGhpcy5mZSgiZ2xvYmFsIikpLHRoaXMuV3EuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sY3M6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5mZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sZmU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2Upe3RoaXMua2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQWM9ITEpO3RoaXMuQWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5BYz90aGlzLkFjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5aZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuRWYpKTt0aGlzLk5iKCk7ZS5CYyhrLmp0KTsoYj1lLlpiKHRoaXMucWQoKSkpfHwoYj1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxXcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZmN8fHRoaXMuTGF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8Cm51bGw7dGhpcy5PZz1hLmFkcGF0aHx8IiI7dGhpcy5xZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkloPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZmMmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuR2MoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEdjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuSmMoKSksZD10aGlzLnphKHRoaXMuZmMpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPQoiUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuZmMrdGhpcy5mZSgiY3VzdG9tZXIiKSk7dGhpcy5EYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImN1c3RvbWVyIik7YT90aGlzLmVtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZW09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxTdTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkRjPSEwO3RoaXMuR2MoITApO3JldHVybn19dGhpcy5NZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuc2c9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmpiPQp0aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaGM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5qYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy53Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnZjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5pZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5paD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmxjPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5sYzt0aGlzLkxoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuJGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmtpPWIudm1hcHN8fCIiO3RoaXMuWmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8CjFFMzt0aGlzLk9mPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmdjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuUHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnFlJiYodGhpcy5nYz1udWxsKTt0aGlzLnJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkRjPSEwLHRoaXMuR2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMubXYoKSYmKHRoaXMuaGN8fHRoaXMuamN8fHRoaXMuaWN8fHRoaXMuZ2N8fHRoaXMuSWQpP3RoaXMuJGU/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSksdGhpcy5tZSgpLHRoaXMuTmIoKSk6dGhpcy5ZdSgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlp1KCkpfX0sWXU6ZnVuY3Rpb24oKXt0aGlzLlh1KCk7CnRoaXMuJHUoKX0sJHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsCiIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9CmQpe3ZhciBjPWUuaGQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxadTpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpO3RoaXMuTmIoKX0sT2M6ZnVuY3Rpb24oYSl7dGhpcy5SYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIoYSkpLHRoaXMuTmIoKSx0aGlzLm1lKCkpfSxYdTpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmhoKCkpdGhpcy5PYyh0aGlzLm5jLAoibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5WaCgpfX1lbHNlIHRoaXMuVmgoKX0sVWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLkhiKCkpO3RoaXMuY3YoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm5mLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuaWM9dGhpcy5JZCkmJnRoaXMuaWMubGVuZ3RoKXt2YXIgZD10aGlzLmljLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubmYoKX0sY3Y6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGMsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5VaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5qYyYmdGhpcy5qYy5sZW5ndGgpe3ZhciBkPXRoaXMuamMuc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5VaCgpfSxkdjpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nYz8odGhpcy5xZisrLHRoaXMuRGEobmV3IHoodGhpcy5nYyksdGhpcy5XdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5vZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlNoKCl9LG9mOmZ1bmN0aW9uKGEpe3RoaXMuT2ModGhpcy5GZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LFd1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnFmP3RoaXMubmYoKTp0aGlzLm9mKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuU2goKTp0aGlzLm9mKCJBQUEiKX0sU2g6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5tZSgpfSxoaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUmMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaGgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5PZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk9kJiZ0aGlzLk9kKCl9LGVwOmZ1bmN0aW9uKCl7aWYodGhpcy51ZiYmdGhpcy4kcSgpKXt2YXIgYT10aGlzLkhxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxaaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnBkfHwodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlBnJiYhdGhpcy5RZyYmKHRoaXMuUWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlBnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5uaT0hMCk7cSYmZS5OcigpJiYoYS5BZz0hMCk7ZyYmKGEuUmg9ITApO3JldHVybiBhLmxvYWQoKX0sYnA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxWdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMua2l9LGNwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMuSXYuYmluZCh0aGlzKSx0aGlzLkh2LmJpbmQodGhpcykpfSxJdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMubHEoKX0sSHY6ZnVuY3Rpb24oKXt9LApscTpmdW5jdGlvbigpe2UuQmMoay5rcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYWIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxtdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnJmfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmxrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucG09dGhpcy5hWzFdO3RoaXMuQ209dGhpcy5hWzJdO3RoaXMueGw9dGhpcy5hWzRdO3RoaXMuQ3Q9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMl19Yy5aaj1iO2IucHJvdG90eXBlPXtvbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucG06dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNtOnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueGw6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMuWmp8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLm9tKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmJiPWEuZi5QKCk6dGhpcy5iYj0iIjthLmYuWGcmJmEuZi5YZyh7cGF1c2U6dGhpcy53ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkdoLmJpbmQodGhpcyksbXV0ZTp0aGlzLlBlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuQXYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5pYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlZiPXRoaXMuWWM9ITE7dGhpcy5Jbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkZkPXt9O2Uub2IoIm5ld0JpZ0FkSWQiKTt0aGlzLkxvPWUuYWEoMTApO3RoaXMubGY9MDt0aGlzLldjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuV2M9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYKKGE9dGhpcy5iLmYucygpKSx0aGlzLldjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlZuPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuc2g9dGhpcy5FZD0hMTt0aGlzLmxoPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5lZT0hMTt0aGlzLmJpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYWM9ITE7dGhpcy5zcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5NaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5QZD10aGlzLk9iPXRoaXMub2U9dGhpcy5lZD10aGlzLkdkPXRoaXMucmI9dGhpcy5tYz10aGlzLnVoPXRoaXMua2Q9dGhpcy5udj10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5yYz1bXTt0aGlzLmNjPXt9O3RoaXMuZ3Q9MjAwO3RoaXMuQmY9CnRoaXMuQ2Y9dGhpcy5qZT10aGlzLkFmPXRoaXMuWmU9ITE7dGhpcy52ZD17fX1jLmZrPWI7Yi5wcm90b3R5cGU9e2d1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGJ9LCRoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkNiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5MdSgpO2UudihrLkxuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEtlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5sZisrLGUub2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5lcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJgp0aGlzLkwuaXNFbmFibGVkPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmxjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuJGgoKSxuZXcgUyh0aGlzLGEsdGhpcy5saCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5sYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7CmVsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLktlKGEsYixjKX0sNTApfX0sVmU6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5rZD0hMTt0aGlzLmM9YTt0aGlzLnV1KHRoaXMuYyk7dGhpcy52ZD1uZXcgUWEodGhpcy5jLkt2LHRoaXMudmlkZW8se30pO3RoaXMuTGcoYSk7dGhpcy5yYz10aGlzLkNnKGEpO3RoaXMubnAoKX0sTGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuRmQ9dGhpcy5TcShhKSksdGhpcy5MZyhhLnBhcmVudCkpfSxDZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuQ2coYS5wYXJlbnQpKSxjLnB1c2godGhpcy5DcShhKSkpO3JldHVybiBjfSwKQ3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LFNxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8CmYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5rYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZ2QmJmEuZ2QuZXJyb3ImJmEuZ2QuZXJyb3IuY29kZSYmKGI9YS5nZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlBjLmNvZGU6Yj09Ry5XZC5jb2RlP2UudihrLmh3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpOihlLkxlKCksYj09Ry5KZi5jb2RlJiZlLnYoay5Hcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5qcSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuTXUoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmUudihrLkp2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLnYoay5wdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUudihrLnd3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5Icyx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsuRnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsuR3YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuV2IoYSk7dGhpcy5SYSgpfSxXYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLkplKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSx1dTpmdW5jdGlvbihhKXt0aGlzLm9lPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTsKdGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5aZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLkl4PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7CnRoaXMuVm4mJnRoaXMucGxheWVyLnVlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci51ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuUW4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLlplJiZiLmxvYWQoKTtpZih0aGlzLldoKGIpKXt0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt0aGlzLlRuKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5aZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz0KdGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLm9wKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5zdSgpKTp0aGlzLmMub3JpZ2luLnRnKHcuVGQpfSxzdTpmdW5jdGlvbigpe3RoaXMuQWY9ITA7dGhpcy5yYj10aGlzLm1jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnJiPSEwKTtlLm5lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlVuKHRoaXMuYy5vcmlnaW4udmEpOwp0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnZoKCk7dGhpcy5iLmpmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5qZigpO3RoaXMudGE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmdpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuVnEoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuY2coImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmdlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuR2QmJnRoaXMuYi5mLkFhKCkmJmUudihrLnljLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi4kYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5yYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuWHYoKSx0aGlzLmIuJGIoITApLCF0aGlzLk9iKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsCmNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLiRiKCEwKSx0aGlzLmV3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN3KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR3KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZncoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuYncoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubGkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9CmEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlViKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmtnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5aYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuYmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT0KYS5kYXRhLm5hbWUmJih0aGlzLkNmJiYodGhpcy5CZj0hMSx0aGlzLmVjKCkpLHRoaXMuWnYoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnJiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpOwplLmdlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuZ2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuJGYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubWM9ITB9LFp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSk7dGhpcy5tYz0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLk9oKCk7ZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sZXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sY3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5rZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSl9LGR3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxidzpmdW5jdGlvbigpe3RoaXMud2YoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxsaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm5lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSwKV3Y6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmd3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5saSghMCl9LFFuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5GYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5Sdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LApXaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sVG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxBZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5oaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxoaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMueWYoYSl9LmJpbmQodGhpcyksdGhpcy5JbykpfSx5ZjpmdW5jdGlvbihhKXtpZighdGhpcy5ZYyYmdGhpcy5XaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLlZiKXt0aGlzLlljPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5BZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnNnfHwKdGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuT3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5qZigpO3RoaXMuTnYoKTt0aGlzLmdpKCk7dGhpcy5kZygpO3RoaXMuYi52aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5tZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLmVkfHx0aGlzLlFmKCl9LFFmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZWR8fChhP3RoaXMuUmEoKToodGhpcy5QZSghMCksdGhpcy5RZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0uYmluZCh0aGlzKTt0aGlzLndlKCkuSmgodGhpcyl9LHdmOmZ1bmN0aW9uKCl7dGhpcy5MLmpiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkpuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxNbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkdnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuSnUoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlFkJiZ0aGlzLk1uKHRoaXMuYy5RZCk7CmlmKCF0aGlzLm9lKWlmKHRoaXMub2U9ITAsdGhpcy5QZHx8KGUudihrLkpzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucGMpe2Uub2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMubGYrKzt0aGlzLlZiPXRoaXMuWWM9ITE7dHJ5e3RoaXMuQWQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkVkPSExO3RyeXt0aGlzLmIuZGkoKX1jYXRjaChnKXt9dGhpcy5HZD0hMDt0aGlzLmIuQWUoKTt0aGlzLmFjPSExO3RoaXMud2UoKS5FaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5RZSgpO3RoaXMuYy5wYyYmKGE/dGhpcy5jLm9yaWdpbi5waCgpOnRoaXMucGUoKSl9ZWxzZSB0aGlzLnBlKCl9LApSdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMueGYoYSkpfSx4ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5icCgpO3RoaXMuYy5vcmlnaW4udGcody5UZCl9LGlpOmZ1bmN0aW9uKCl7aWYodGhpcy5udil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5HZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsueWMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnJ2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlBkPSEwO2UudihrLmppLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkZlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmtmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1oKSkmJihjPXRoaXMuYy5rZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuRWR8fCh0aGlzLkVkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLldmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLlZiPXRoaXMuWWM9ITEsdGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkVkPSExLHRoaXMuYi5kaSgpLHRoaXMuYy5vcmlnaW4uUWUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5XYy5yZXBsYWNlKCJbdGltZV0iLGUuQmcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5lZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGFpOmZ1bmN0aW9uKCl7dGhpcy51aHx8KHRoaXMudWg9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2UudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5iaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmFpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5haSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLk9oKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwuamImJgp0aGlzLllhKCJzdGFydCIpLGUudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlBmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKgp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmJpPWEpfSxOaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sTHU6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LE9oOmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxNdTpmdW5jdGlvbigpe2UuS2QoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLktkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5BZnx8dGhpcy5MLmpiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmpiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMudmQmJnRoaXMudmQudHJhY2smJnRoaXMudmQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuVHEodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5qZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkZkLmltcHJlc3Npb25zJiYKZS5McihnLnVybCx0aGlzLkZkLmltcHJlc3Npb25zKT90aGlzLkplKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Lbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5GZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSmUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnlwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5BZiYmKGI9Il92cGFpZCIpO3RoaXMuQ2YmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sSmU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5QbihjKSxmfHwKKGY9dGhpcy5yZyksZXx8KGU9dGhpcy5yZyksdGhpcy5SbihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LERoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LG5wOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sT3U6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuY2NbYl0mJmErKztyZXR1cm4gYX0sVHE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx5cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLlB2LmJpbmQodGhpcykpfSxQdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sTnY6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuV2MucmVwbGFjZSgiW3RpbWVdIixlLkJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuJGMmJihiPXRoaXMuTC4kYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLAoxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZ2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnNwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLApmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlhoLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06CihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnF2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucHYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgoobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuTWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5rZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwKKHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksCmMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlBlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQmZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx3ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sR2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0scHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LHF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5yYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnJiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5yYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxQZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm1mKCkpfSxwZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmplJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnNofHwhdGhpcy5MLlJjJiYic3BpZWdlbC5kZSIhPWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5lZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm1nKCkpOih0aGlzLnNoPXRoaXMuQ2Y9dGhpcy5CZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmplPSEwLGE9ZS5jZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5LZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbWc6ZnVuY3Rpb24oYSl7dGhpcy5PdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoITApfS5iaW5kKHRoaXMpLHRoaXMuZ3QpOih0aGlzLkdkPSEwLHRoaXMuYi5BZSgpLHRoaXMuYi5idSgpLHRoaXMuYWM9ITEsCmUudihrLnJwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy53ZSgpLkVoKCkpfSx3ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkVlKHRoaXMudmlkZW8sYSk/dGhpcy5HaCgpOnRoaXMud2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5VYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnJjJiYwPHRoaXMucmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnJjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5MbysiLSIrdGhpcy5sZjt0aGlzLmMmJnRoaXMuYy5IZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSGcoKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ma3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGo9dGhpcy5hWzVdO3RoaXMua289dGhpcy5hWzJdO3RoaXMuUnM9dGhpcy5hWzhdO3RoaXMubHc9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy50bj1iO2IucHJvdG90eXBlPXtzajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGo6dGhpcy5qbyhhKX0sam86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmtvOgp0aGlzLlFzKGEpfSxRczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnM6dGhpcy5rdyhhKX0sa3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmx3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy50bnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuc2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLmhzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLlNtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmhkKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5EYShiLHRoaXMuZ3MuYmluZCh0aGlzKSx0aGlzLmRzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5RcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5WdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxRcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuTHQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9CnRoaXMuRGcoKTt0aGlzLnNjPXRoaXMucGYoKTt0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEucmVzcG9uc2VVUkw7dGhpcy5ZLmxlbmd0aD90aGlzLkljKCk6dGhpcy5zYSh0aGlzLlNhKHcuUGMse2Vycm9yOnRoaXMuemY/Ry5XZDpHLklmfSkpfSxoczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpO3RoaXMucWM9dGhpcy5UaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sZHM6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5IZix7ZGVwdGg6YX0pKX0sSWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5TcigpP3RoaXMuZXYoKT8oYSsrLApuZXcgYih0aGlzLHRoaXMuTWcoKSxoLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMuc2EodGhpcy5TYSh3LktmKSk6KGE9MCx0aGlzLkR2KCkmJnRoaXMuVmUodGhpcy53cCgpKSl9LFFlOmZ1bmN0aW9uKCl7dGhpcy5zYz8odGhpcy5zYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5RZSgpfSxwaDpmdW5jdGlvbigpe3RoaXMucWM/KHRoaXMucWM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQucGgoKX0sRHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idigpP3RoaXMuYXYoKT8hMDooLTEhPXRoaXMuQ2MoKT90aGlzLnNhKHRoaXMuU2Eody5TZCkpOnRoaXMuc2EodGhpcy5TYSh3LkRmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5QYyxHLkpmKSksITEpfSxWZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5RZHx8KGEuUWQ9CltdKTthLlFkLnB1c2godGhpcy5TZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk1lKCkpO2EudGI9YS50Yj9hLnRiOnRoaXMuc2M7YS5wYz1hLnBjP2EucGM6dGhpcy5xYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5wYXJlbnQuVmUoYSl9LHdwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuQ2MoKTthLk89dGhpcy5KZygpO2EuVWI9dGhpcy5EcSgpO2EuS3Y9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5BcSgpO2Eua2Y9dGhpcy5ScShhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLnpnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT13LlNkLmNvZGU/Yi5QYS5jb25jYXQodGhpcy5FcSgpKTpiLlBhLmNvbmNhdCh0aGlzLk1xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuV2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sZXY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxidjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuSmcoKS5sZW5ndGh9LAphdjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQ2MoKX0scGY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxUaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucGYoKSYmKGE9ITApO3JldHVybiBhfSxMdDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk1nKCkubGVuZ3RofSxNZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwKIlZBU1RBZFRhZ1VSSSIpfSxCcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwiQWRTeXN0ZW0iKX0sTWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy4kZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LCRnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuJGcoYS5wYXJlbnROb2RlKToKITF9LE1xOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxEcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxKZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSwKang6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsCmM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMubmQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LENjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxScTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd1KGQsYSksMD5iJiYKKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLlNtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllrPXRoaXMuYVszXTt0aGlzLk1zPQp0aGlzLmFbN107dGhpcy5rcD10aGlzLmFbMTBdO3RoaXMuWm49dGhpcy5hWzddO3RoaXMucHQ9dGhpcy5hWzVdO3RoaXMuVXU9dGhpcy5hWzhdO3RoaXMueHY9dGhpcy5hWzEwXTt0aGlzLnlrPXRoaXMuYVs3XTt0aGlzLmh2PXRoaXMuYVs4XTt0aGlzLnZpPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuWXA9YjtiLnByb3RvdHlwZT17WGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zazp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTXM6dGhpcy5qcChhKX0sanA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtwOnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abjp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucHQ6dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV1OnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy54djoKdGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlrOnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5odjp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLllwfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Yayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlViPSIiO3RoaXMuQj10aGlzLnBjPXRoaXMudGI9ITE7dGhpcy5CZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuQ2U9IiJ9Yy5SbD1iO2IucHJvdG90eXBlPXtvcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSwKYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxLcTpmdW5jdGlvbigpe2lmKCF0aGlzLkJlJiYKdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkdhKXt2YXIgYT10aGlzLm9yaWdpbi5HYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkJlPWFbY10pfXJldHVybiB0aGlzLkJlfSxIZzpmdW5jdGlvbigpe2lmKHRoaXMuQ2UpcmV0dXJuIHRoaXMuQ2U7dmFyIGE9IiI7KGE9dGhpcy5LcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuQ2U9YX0sVnE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLlJsfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuaW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMV19Yy5pdD1iO2IucHJvdG90eXBlPXtobzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLml0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5obyg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LERmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxQYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCk9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEx3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSWk9dGhpcy5hWzldO3RoaXMuQXc9dGhpcy5hWzEwXTt0aGlzLnlyPXRoaXMuYVsyXTt0aGlzLkFyPXRoaXMuYVsxXTt0aGlzLnZ3PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuSXA9YjtiLnByb3RvdHlwZT17SGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklpOnRoaXMuencoYSl9LHp3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bdzp0aGlzLnhyKGEpfSx4cjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXI6dGhpcy56cihhKX0senI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Bcjp0aGlzLnV3KGEpfSx1dzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLklwfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5IaSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmdkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuU2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlNqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zcj10aGlzLmFbMTBdO3RoaXMuVmk9dGhpcy5hWzFdO3RoaXMubG49dGhpcy5hWzRdO3RoaXMueHE9CnRoaXMuYVszXTt0aGlzLlVyPXRoaXMuYVs0XTt0aGlzLkN2PXRoaXMuYVsxXTt0aGlzLmpqPXRoaXMuYVs4XTt0aGlzLnltPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuenQ9YjtiLnByb3RvdHlwZT17WHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLllyOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5WaTp0aGlzLmtuKGEpfSxrbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubG46dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhxOnRoaXMuVHIoYSl9LFRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vcjp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy55bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLnp0fHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5Ycig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuRmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5OZD1bXTt0aGlzLkNoPVtdO3RoaXMuUmU9W107dGhpcy5Rdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMuWms9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5GaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZoW2FdLApjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLkV4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlp0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLlF0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz0KYztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuTmQucHVzaCh7c3JjOmMsZnJhbWU6ZyxodDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5SZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlJlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy5GcShhKSl9fSxGcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntOeDohMCxNeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntBeDoidmlkZW8iLFB4OiJqc0N1c3RvbSIsUXg6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxSeDoxLApreDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LFVxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5OZC5sZW5ndGg7YisrKWlmKHRoaXMuTmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5OZFtiXS5odDtyZXR1cm4iIn0sWnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkNoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlVxKGIpLHZlbmRvcjpifSk7dGhpcy5LdSgpfSxRdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuUXYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSwKYil9LmJpbmQodGhpcykpOnRoaXMuYWcoYSxiKX0sYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLlJlLnB1c2goe3R5cGU6YSxWbzpiLEt4OiExfSl9LEt1OmZ1bmN0aW9uKCl7dGhpcy5DaC5tYXAoZnVuY3Rpb24oYSl7YS5Pcnx8KGEuRHgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLk94LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Pcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5aa3x8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXU9dGhpcy5hWzldO3RoaXMub3c9dGhpcy5hWzhdO3RoaXMud3U9dGhpcy5hWzldO3RoaXMuc2w9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5vcj1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmV1OnRoaXMubncoYSl9LG53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vdzp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud3U6dGhpcy5ybChhKX0scmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnNsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5vcnx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuZHUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5pYj1hLkVnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmJnPSExO3RoaXMuVGI9W119Yy51aj1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnpxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5rcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDsKZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUnU6ZnVuY3Rpb24oKXt0aGlzLmJnPSEwfSxkaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5mLnMoKSl9LGJ1OmZ1bmN0aW9uKCl7dGhpcy5iZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZGQsdGhpcy5mLnMoKSkpfSxqZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5pYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5pYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTt0aGlzLmYuTGMmJnRoaXMuZi5MYygpP3RoaXMuZi5FZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LGtyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx0cTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249Yi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSwkYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRxKHRoaXMuaWIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQWUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkxjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9CmIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUuUGgodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy4kYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEFlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTsKZm9yKHZhciAkYT1jLnVqfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy4kcD10aGlzLmFbMV07dGhpcy5Cbz10aGlzLmFbNF07dGhpcy5NbD10aGlzLmFbNF07dGhpcy54bj10aGlzLmFbMV07dGhpcy5Ybj10aGlzLmFbNF07dGhpcy52dj0KdGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5pdz1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMub286dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRwOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cbzp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWw6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhuOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ybjp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudnY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5pd3x8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLm5vKDQpOyhmdW5jdGlvbihjKXtjLkRsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5CZChiKTt0aGlzLnBnKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKSl9LApwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxBYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkOwpiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGNiPWMuRGx8fGNiOyhmdW5jdGlvbihjKXtjLkNsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kYSgpO3RoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5UZj10aGlzLlZmPXRoaXMuV2c9dGhpcy5lYT10aGlzLnNmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuV2cmJnRoaXMuamcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmYS5hYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmJkKCk7dGhpcy5XZz0hMDt0aGlzLmpnKCl9LmJpbmQodGhpcykpO3RoaXMuZmcoKX0samc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5iZCgpO2lmKCF0aGlzLnNmJiYhdGhpcy5iZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuc2YmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LApLZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxmZzpmdW5jdGlvbigpe2lmKHRoaXMuYmQoKSl7dmFyIGI9dGhpcy5LZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9Yi5oeH10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LGx4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLnl4KCk6ITF9LENjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/CmIuQ2MoKTotMX0sTnE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLlNiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5EZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLk5xKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBkYj1jLkNsfHxkYjsoZnVuY3Rpb24oYyl7Yy5FbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFByOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlZsLkFuLnluP3dpbmRvdy5PTy5WbC5Bbi55bi5meChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnhlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYywKdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBlYj1jLkVsfHxlYixmYj1uZXcgZWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXA9dGhpcy5hWzhdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuYWo9dGhpcy5hWzFdO3RoaXMuZHI9dGhpcy5hWzRdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMuaHI9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzhdO3RoaXMucGs9dGhpcy5hWzNdO3RoaXMuR2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbN119Yy5GcD1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuJGkoYSl9LCRpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5hajp0aGlzLmNyKGEpfSxjcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhPwp0aGlzLmRyOnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kbjp0aGlzLmdyKGEpfSxncjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaHI6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnVyOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wazp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5GcHx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuRHAoNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk5nKCl9LApOZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy55aCgpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuZmp8fGhiOyhmdW5jdGlvbihjKXtjLmVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSwKdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmdnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2coYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuZWp8fGliOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCkJoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zcXx8KHRoaXMuc3E9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkJoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5CaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuZ2p8fGpiLFQ9bmV3IGpiKHIpO1QuZygpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xbD10aGlzLmFbOF07dGhpcy5zcj10aGlzLmFbNV07dGhpcy5JdT10aGlzLmFbMTBdO3RoaXMuY289dGhpcy5hWzldO3RoaXMuRnc9dGhpcy5hWzhdO3RoaXMuR209dGhpcy5hWzhdO3RoaXMuQ2o9dGhpcy5hWzhdO3RoaXMuam49dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMV19Yy50cD1iO2IucHJvdG90eXBlPXtwbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWw6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNyOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JdTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY286dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZ3OnRoaXMuRm0oYSl9LEZtOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuR206dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMudHB8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnBsKDQpOyhmdW5jdGlvbihjKXtjLnJtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ybXx8VTsoZnVuY3Rpb24oYyl7Yy5xbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIisKYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guVmMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5OcyhhKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5acSgpfSxOczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7CnJldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn19dGhpcy51KCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMucW18fFY7KGZ1bmN0aW9uKGMpe2Muc209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUuQnAoYix0aGlzLnVkKSk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMudWR8fCh0aGlzLnVkPVtdKSx0aGlzLnVkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSwKZnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5IY3x8KHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChiKSx0aGlzLmF1KCkmJih0aGlzLmJmKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LFpxOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGI9MDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPQowO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LmZ2KGIpfX0pfSkoYyk7dmFyIGxiPWMuc218fGxiLHg9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWo9dGhpcy5hWzhdO3RoaXMuU2k9dGhpcy5hWzJdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMuYnM9dGhpcy5hWzJdO3RoaXMuem89dGhpcy5hWzNdO3RoaXMuZXE9dGhpcy5hWzNdO3RoaXMuYW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNl19Yy5MbT1iO2IucHJvdG90eXBlPXt6ajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFqOnRoaXMuUmkoYSl9LApSaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU2k6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBvOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5iczp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem86dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVxOnRoaXMuJG4oYSl9LCRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1iPWMuTG18fG1iLE9jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLnpqKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7CnRoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LEFhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuYmp8fG5iOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLmNqfHxvYjsoZnVuY3Rpb24oYyl7Yy5kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTihnKXx8Cih0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLmRqfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzldO3RoaXMuQWs9dGhpcy5hWzldO3RoaXMuS2o9dGhpcy5hWzJdO3RoaXMuZnI9dGhpcy5hWzRdO3RoaXMuUWs9dGhpcy5hWzEwXTt0aGlzLndqPXRoaXMuYVs1XTt0aGlzLmlxPXRoaXMuYVs5XTt0aGlzLkN3PXRoaXMuYVszXTt0aGlzLkl0PXRoaXMuYVsxMF07dGhpcy5WcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX0KYy5Xbz1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ0OnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuS2o6dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZyOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Razp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2o6dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pcTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3c6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkl0OnRoaXMuVXAoYSl9LFVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5Xb3x8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuZXQoNCk7KGZ1bmN0aW9uKGMpe2MudWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuUHQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sUHQ6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiYKdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFhnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMudWx8fHNiOyhmdW5jdGlvbihjKXtjLnRsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5taT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5taSYmKHRoaXMuRygpLHRoaXMubWk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnRsfHx0YjsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBiPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy52bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLnhpPXRoaXMuYVsxXTt0aGlzLnZxPXRoaXMuYVszXTt0aGlzLndyPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuU3M9YjtiLnByb3RvdHlwZT17ZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVrOnRoaXMud2koYSl9LAp3aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGk6dGhpcy51cShhKX0sdXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZxOnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy53cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuU3N8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmRrKDQpOyhmdW5jdGlvbihjKXtjLlltPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7CnZhciB3Yj1jLlltfHx3YjsoZnVuY3Rpb24oYyl7Yy5YbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxYYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sTnQ6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy50Yz0KITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5OdCh0aGlzLkNhKToodGhpcy5DYT10aGlzLlhiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpO3JldHVybn1pZighdGhpcy50Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTsKZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLlhtfHx4YjsoZnVuY3Rpb24oYyl7Yy5abT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuWm18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudnA9dGhpcy5hWzVdO3RoaXMuUG09dGhpcy5hWzEwXTt0aGlzLnBzPXRoaXMuYVs2XTt0aGlzLmRsPXRoaXMuYVszXTt0aGlzLk1pPXRoaXMuYVsyXTt0aGlzLkNpPXRoaXMuYVs5XTt0aGlzLmFtPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVsyXTt0aGlzLnFvPXRoaXMuYVszXTt0aGlzLm9sPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuWnI9YjtiLnByb3RvdHlwZT17dXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZwOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QbTp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucHM6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NaTp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ2k6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5hbTp0aGlzLnptKGEpfSx6bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQW06dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFvOnRoaXMubmwoYSl9LG5sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuWnJ8fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLnVwKDQpOyhmdW5jdGlvbihjKXtjLmNtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5XZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucnQoKX0uYmluZCh0aGlzKSw1MDApfSxydDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLldlJiYKd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LE51OmZ1bmN0aW9uKCl7dGhpcy5XZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuY218fEJiOyhmdW5jdGlvbihjKXtjLmJtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ucz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMua2N8fCh0aGlzLmtjPQowLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5ucz8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuTnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLmJtfHxDYjsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuZG18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bj10aGlzLmFbM107dGhpcy5qbT10aGlzLmFbNl07CnRoaXMuU2s9dGhpcy5hWzNdO3RoaXMuQ3I9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5XbD1iO2IucHJvdG90eXBlPXt1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5pbShhKX0saW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmptOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tazp0aGlzLkJyKGEpfSxCcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLldsfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1TYy51big0KTsoZnVuY3Rpb24oYyl7Yy5ZbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5ZbHx8R2I7KGZ1bmN0aW9uKGMpe2MuWGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuS2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnBwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMubWQoKTsKMDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy4kcigpOnRoaXMuaWcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxwcDpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5tKCEwKX0sJHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7IWIucWEmJmIuWSYmYi5leCYmYi5neCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGlnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PQpiPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCl9LmJpbmQodGhpcyksMTAwKX0sbWQ6ZnVuY3Rpb24oKXtpZighdGhpcy50aClmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuS2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudGg9YltjXSk7cmV0dXJuIHRoaXMudGh9LHp4OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLm1kKCkuYWRzTG9hZGVyP3RoaXMuRyghMCk6dGhpcy5HKCk6dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBIYj1jLlhsfHxIYjsoZnVuY3Rpb24oYyl7Yy5abD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgSGIoYyx0aGlzLkkpKS5nKCkpfXJldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgSWI9Yy5abHx8SWIsSmI9bmV3IEliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBxPXRoaXMuYVsxMF07dGhpcy5xcj10aGlzLmFbN107dGhpcy5PbD10aGlzLmFbMTBdO3RoaXMuRXQ9dGhpcy5hWzhdOwp0aGlzLnR3PXRoaXMuYVsxMF07dGhpcy50dj10aGlzLmFbOF07dGhpcy5CbD10aGlzLmFbM107dGhpcy5saj10aGlzLmFbM107dGhpcy5ubT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLnhwPWI7Yi5wcm90b3R5cGU9e29xOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wcTp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXI6dGhpcy5ObChhKX0sTmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9sOnRoaXMuRHQoYSl9LER0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5FdDp0aGlzLnN3KGEpfSxzdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHc6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR2OnRoaXMuQWwoYSl9LEFsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CbDp0aGlzLmtqKGEpfSxrajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGo6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMubm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnhwfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5vcSg0KTsoZnVuY3Rpb24oYyl7Yy5Waz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7SCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlcoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LAp4eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Wa3x8WDsoZnVuY3Rpb24oYyl7Yy5Vaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhlPWIuaWQpO0g/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGUmJmIhPXRoaXMuWGV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmCiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkZ4KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy51KCJhZGVycm9yIiksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFk9Yy5Va3x8WTsoZnVuY3Rpb24oYyl7Yy5Xaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/CiExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWChiKSxiLm5hP3RoaXMuYmYoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEgsTGI9Yy5Xa3x8TGIsTWI9bmV3IExiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jaj10aGlzLmFbMTBdO3RoaXMuWmk9dGhpcy5hWzRdOwp0aGlzLmJxPXRoaXMuYVs2XTt0aGlzLmdsPXRoaXMuYVszXTt0aGlzLllxPXRoaXMuYVs4XTt0aGlzLm5qPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3M9YjtiLnByb3RvdHlwZT17SGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLklqOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5aaTp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnE6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmdsOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ZcTp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLktzfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuSGooNCk7KGZ1bmN0aW9uKGMpe2MuYWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSxhJiZjPyh0aGlzLlcoYyksdGhpcy5aKGEpKTp0aGlzLmNhKCkpOnRoaXMuY2EoKTp0aGlzLmNhKCk6dGhpcy5jYSgpfSxmdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LEN4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuYWt8fE9iOyhmdW5jdGlvbihjKXtjLiRqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpezEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IiwKZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMub2EoKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIFBiPWMuJGp8fFBiOyhmdW5jdGlvbihjKXtjLmJrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7Ynx8KGI9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYiYmYi5HZXRBbGxQbGF5ZXJzJiYoYj1iLkdldEFsbFBsYXllcnMoKSkmJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm5hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5ia3x8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5SbT10aGlzLmFbNF07dGhpcy55dT10aGlzLmFbNF07dGhpcy50cz10aGlzLmFbMl07dGhpcy55aj10aGlzLmFbM107dGhpcy5Fcz10aGlzLmFbOF07dGhpcy5IcD10aGlzLmFbM107dGhpcy5qcj10aGlzLmFbNl07dGhpcy54bz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsyXX1jLnRtPWI7Yi5wcm90b3R5cGU9e1FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5SbTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXU6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRzOnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55ajp0aGlzLkRzKGEpfSxEczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRXM6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhwOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuanI6dGhpcy53byhhKX0sd286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy50bXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuUW0oNCk7KGZ1bmN0aW9uKGMpe2MuZm49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuVyhhKX1lbHNlIHRoaXMuY2EoKX0sCkxkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxPdDpmdW5jdGlvbigpe3RoaXMuUmQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuUmQ9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX19LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLmZufHxUYjsoZnVuY3Rpb24oYyl7Yy5lbj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxTdDpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksCmIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSl9LGFkOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpOwphLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sTmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0wO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuYWQod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk5mLmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuU3Qod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5OZigpO3RoaXMuUnQoKX0sUnQ6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLAp0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oKXt9KX0sbTpmdW5jdGlvbihiKXt0aGlzLk10P3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbigpe3RoaXMuTXQ9ITB9fSl9KShjKTt2YXIgVWI9Yy5lbnx8VWI7KGZ1bmN0aW9uKGMpe2MuZ249dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5PdCgpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7CnZhciBWYj1jLmdufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLkFwPXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzZdfWMud209YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5tOnRoaXMuenAoYSl9LHpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5BcDp0aGlzLnFqKGEpfSxxajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLndtfHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy5NbSg0KTsKKGZ1bmN0aW9uKGMpe2MuSW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy53aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLkNzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxmdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLAphPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMud2gmJih0aGlzLndoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy5JbXx8TzsoZnVuY3Rpb24oYyl7Yy5IbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnJ1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKaGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLkhtfHxQOyhmdW5jdGlvbihjKXtjLkptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuYmYoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLkptfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9CnRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuY2s9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkd0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5ja3x8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnQoNCk7KGZ1bmN0aW9uKGMpe2MuTms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Naz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuYmgoKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnFiKCksITA7dGhpcy5UZysrO2lmKDEwPAp0aGlzLlRnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmguYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PQp0eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPwoodGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLk1rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Paz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsCnRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLk9rfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHY9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbN119Yy5rbD1iO2IucHJvdG90eXBlPXtrdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLmtsfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMua3YoNCk7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaGcoKX0sCmhnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5Xanx8ZWM7KGZ1bmN0aW9uKGMpe2MuWWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz0KbmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmx0PXRoaXMuYVs0XTt0aGlzLk1wPXRoaXMuYVsyXTt0aGlzLldzPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzVdfWMuVG09YjtiLnByb3RvdHlwZT17a3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmx0OnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NcDp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLldzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuVG18fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmt0KDQpOyhmdW5jdGlvbihjKXtjLnBpPQpwLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5waXx8aWM7KGZ1bmN0aW9uKGMpe2Mub2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMub2l8fGpjOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj0KbmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMucml8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56bD10aGlzLmFbN107dGhpcy56aT10aGlzLmFbOV07dGhpcy5ubj10aGlzLmFbMTBdO3RoaXMuQXU9dGhpcy5hWzFdO3RoaXMuWHA9dGhpcy5hWzFdO3RoaXMucW49CnRoaXMuYVsyXTt0aGlzLlFpPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbNV07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5XaT1iO2IucHJvdG90eXBlPXt5bDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpsOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56aTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubm46dGhpcy56dShhKX0senU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF1OnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5YcDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucW46dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFpOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Zczp0aGlzLnFrKGEpfSxxazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucms6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5XaXx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMueWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZWg9dGhpcy5naD10aGlzLmZoPSExO3RoaXMueGQ9W107dGhpcy5hZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYj8KbnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBFYj9udWxsOkViLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgemI/bnVsbDp6YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBsYz8KbnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuVGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5PcShhKTpbXSxiO3RoaXMuZ2g9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZmg9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuSGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmFmKXtpZih0aGlzLmVoKWJyZWFrO2I9dGhpcy5hZltjXTt0aGlzLnZmKGIpJiYodGhpcy54ZC5wdXNoKGIpLHRoaXMuSGgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxPcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSwKUHU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmZoKWZvcih0aGlzLmVoPSEwLGE9MDthPHRoaXMueGQubGVuZ3RoO2ErKyl0aGlzLnhkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGRbYV0uTGIpfX19KShjKTt2YXIgbmM9Yy5UbHx8bmMsTT1uZXcgbmM7TS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWW89dGhpcy5hWzldO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMucnc9dGhpcy5hWzFdO3RoaXMudm89dGhpcy5hWzEwXTt0aGlzLk12PXRoaXMuYVszXTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLlNvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzldfWMuS209YjtiLnByb3RvdHlwZT17WG86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLllvOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Obzp0aGlzLnF3KGEpfSwKcXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJ3OnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52bzp0aGlzLkx2KGEpfSxMdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk12OnRoaXMudXMoYSl9LHVzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52czp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYz1jLkttfHxvYyxhZD1uZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5Ybyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOgoiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQmMoay5FdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuQmMoay5JcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLApyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLllnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWWcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtJLmthKCk7dmFyIGNkPWJkKGZ1bmN0aW9uKCl7ZS55Zyh3aW5kb3csSS5FcigpLHtpZDpjZH0pfSw1MDApLGlhPWUuYWEoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenY9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMl19Yy5ibD1iO2IucHJvdG90eXBlPXt5djpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPWMuYmx8fHBjLGRkPW5ldyBwYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWRkLnl2KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy54aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMuc2Q9MDt0aGlzLmJiPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0saXU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxodTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oYSxiKXtlLmZhKCJ3ZWx0LmRlIikmJmUuYWIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5IcigpKXRoaXMubGIubCh0aGlzLmxiLm9kLHRoaXMubGIud2EsdGhpcy5sYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLkFjKTsKZWxzZSBpZih0aGlzLmFyKCkpdGhpcy5jdShmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudihrLnljLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3ICRhKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5SdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLm9iKCJuZXdIb21hZERpc3BsYXkiKTtSPWw9bmV3IFJhKGwsdGhpcy5sYixnKTtsLmd1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5tcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sCmcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuS2UoYSxjLGYpO3RoaXMucGxheWVyLkpoKGwpfX0sSHI6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxiPTA7aWYodGhpcy5zZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLnNkLmdldFRpbWUoKSx0aGlzLnNkPWEsM0U1PGI/ITA6ITE7dGhpcy5zZD1hO3JldHVybiExfSxFdTpmdW5jdGlvbigpe2Uub2IoInByZXJvbGwiKTtlLmZmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0sRHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7CmUub2IoInBvc3Ryb2xsIik7dGhpcy5udSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy51ZyhjKSk/dGhpcy5NYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxWdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnR1KHRoaXMuRHUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTsKaWYoIXRoaXMubWgpe3RoaXMubWg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuTWMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZGQsdGhpcy5wbGF5ZXIucygpKSl9fSxVdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLm11KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuRXUoKTt0aGlzLnBsYXllci5OZSYmdGhpcy5VdCgpO3RoaXMuVnQoKX0sV3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9CjA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMueWQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLkR3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy56ZD10aGlzLnlkLmxlbmd0aH0sYXI6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPHRoaXMuemQmJihhPSEwKTtyZXR1cm4gYX0sY3U6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLnh0LmJpbmQodGhpcykpfSx4dDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0sbXM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTsKcmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnNpfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFwPXRoaXMuYVsxXTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLlVzPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMuVGk9YjtiLnByb3RvdHlwZT17UHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFwOnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlRpfHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9ZWQuUHAoNCl9KS5jYWxsKGthZWNoYWVNQW9sYWVidVosa2FlY2hhZU1Bb2xhZWJ1Wik7Cg==
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

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:43 GMT
content-encoding
gzip
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
W/"5d1db79a-109"
status
200
access-control-allow-methods
GET
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=900
access-control-allow-headers
accept, content-type
expires
Mon, 07 Oct 2019 02:20:43 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 92E8
653 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=7390465651
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGthZWNoYWVNQW9sYWVidVo9a2FlY2hhZU1Bb2xhZWJ1Wnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5pdShtKTthLmh1KGwpO2EuV3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5xdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzldfWMuRnU9YjtiLnByb3RvdHlwZT17Rm46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkduOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LcDp0aGlzLkRtKGEpfSxEbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRW06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYT1jLkZ1fHxoYSxzYz1uZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRm4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuTmM9W107dGhpcy5uZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnd0LmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5SZz17fTt0aGlzLmRmPSExfWMuaGs9YjtiLnByb3RvdHlwZT17UXU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrdGhpcy5uYltiXSsiXyIpO3JldHVybiBhfSxZYjpmdW5jdGlvbigpe3RoaXMuZGZ8fCh0aGlzLmRmPWUuYWEoMTApKTtyZXR1cm4gdGhpcy5kZn0sb2I6ZnVuY3Rpb24oYSl7dGhpcy5uYlthXXx8KHRoaXMubmJbYV09MCk7dGhpcy5uYlthXSs9MTs1PHRoaXMubmJbYV0mJiF0aGlzLlJnW2FdJiYodGhpcy5SZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIiwKdGhpcy5RdSgpLCEwKSl9LG5lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFVuOmZ1bmN0aW9uKGEpe3RoaXMuYmEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx3dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy52dChhLmRhdGEpfSwKdnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmJhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lciYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxnZTpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxvZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkdnKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5qaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sR2c6ZnVuY3Rpb24oYSl7dmFyIGI9Cm5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFNuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMuemEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS55cShhKSlyZXR1cm47KGI9dGhpcy5vZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09CmF9fSx5cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSx3ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUnI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0seGU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxGZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PQp0eXBlb2YgZD9kOm51bGx9LFBoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTsKdmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTtxPWcuaGVpZ2h0Kmcud2lkdGg7ZD1nLndpZHRoO2Y9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEZlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWUoYS5lbCwKYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihiKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LEhiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSx6ZTpmdW5jdGlvbihhKXt2YXIgYj0KMCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LEtoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixxLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLG09MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2gocSk7c3dpdGNoKG4lCjQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eT1rO3U9bTtyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHEsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSwKdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHEsNSkrKG4meXxuJnV8eSZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChxLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2U9ZStxJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O209bSt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihtKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksCmY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHE+PjYsZz1xJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihxKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sTnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSwKaGQ6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxxPSExLGM9ITEsZT0hMSxnPSExLGs9ITEsbT0hMSxsPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlRiPyEwOiExfWNhdGNoKHUpe310cnl7cT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwKLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPXE7YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LGxyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LAokbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sVGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxmbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEpvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWGkoKXx8YS5oaigpfHxhLmxyKCl8fGEuRmwoKXx8YS4kbSgpfHxhLlRrKCl8fGEuZm0oKX19O3JldHVybiBudWxsIT1hLkpvKCl9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscT1hLmxlbmd0aDtmPHE7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sWmI6ZnVuY3Rpb24oYSl7YT10aGlzLnphKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sUXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy56YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LEJwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LEd1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5jaShiKSsiOiIrdGhpcy5jaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sY2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGZmOmZ1bmN0aW9uKGEpe3RoaXMuQ2I9YX0seWc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5DYjt0aGlzLmNlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7CmEuZGlzcGF0Y2hFdmVudChmKX0sQmM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLnlnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHEsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3EmJihCPWsuVGEoQixxKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuQmMoQil9LHl0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmIuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuUXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxKdTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuWWIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmNlKGEpfSxjZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnl0KGEpO2lmKGIpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bS5KYygpO20ueWEoYSwhMCk7YT1tLnlhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO20uRGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uSmMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwptLnlhKGYsITApO2Y9bS55YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkRhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sS2Q6ZnVuY3Rpb24oYSl7aWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bS5KYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1tLnlhKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO20uRGEoYSl9fSxMZTpmdW5jdGlvbigpe20mJm0uVj9tLmlzRW5hYmxlZCYmbS5jcCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sY2c6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkdlKGEpfHx0aGlzLlJyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guY2YmJndpbmRvdy5zYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMud2coYSkpcmV0dXJuIHRoaXMud2coYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYWIoYSxiLkxhLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnFkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLlNuKGUsYSk7cmV0dXJuIGV9LGFiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIGw9ZXx8bTtlPSEwO2smJihlPSExKTtpZihsJiZsLlYpaWYobC5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtsLnlhKGEsZSk7ZT1sLnlhKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtlLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHIgaW4gZCllLmRhdGFbcl09ZFtyXTtyZXR1cm4gbC5EYShlLGYsYywiIiwiIixnKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYSxiLGQsZixjLGwsZyxrKX0uYmluZCh0aGlzKSw1MDApfSxqaDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fAo0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxrKSxsLndpdGhDcmVkZW50aWFscz1lLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKHIpe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuamgoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuTmMpZm9yKHZhciBjIGluIHRoaXMuTmMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5OY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueGIoYSk7ZCYmCihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sa2g6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihhLGYuTGEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLmZzKGYucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LApxdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5OYz1hfSxEdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOgpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sS286ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LExyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLmhrfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT0KYXx8e319Yy5naz1iO2IuVGE9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLmp0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkhzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuanE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlhmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlBmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLAptZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuVWY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuWWY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLkpuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLlNmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuSnY9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkdzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmtxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IucHc9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iua2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ycD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuZGQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi55Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuV2Y9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkxuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuVWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLiRkPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLmJlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5Lbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iuamk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Kcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnRkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnRmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07CmIubGc9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkZ2PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRXY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Jcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7CnZhciBrPWMuZ2t8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzEwXTt0aGlzLnRvPXRoaXMuYVszXTt0aGlzLldyPXRoaXMuYVs1XTt0aGlzLmJ0PXRoaXMuYVsxMF07dGhpcy5Ebz10aGlzLmFbM107dGhpcy5Qcz10aGlzLmFbMTBdO3RoaXMuSG89dGhpcy5hWzddO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMuR2k9dGhpcy5hWzJdO3RoaXMuS2k9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5ScD1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSW46dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnRvOnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xcjp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnQ6dGhpcy5DbyhhKX0sQ286ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuRG86dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBzOnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ibzp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS3c6dGhpcy5GaShhKX0sRmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5HaTp0aGlzLkppKGEpfSxKaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2k6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLlJwfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Ibig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmlrPWI7Yi5wcm90b3R5cGU9e3plOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09CmEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LExxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LApsZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubGQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxFcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxZZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnplKHRoaXMuTHEoKSsiIiksCmE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaWt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMuT2k9dGhpcy5hWzVdO3RoaXMuRWk9dGhpcy5hWzhdO3RoaXMubnE9dGhpcy5hWzEwXTt0aGlzLmhtPXRoaXMuYVs0XTt0aGlzLkhrPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuR3c9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1sOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53azp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhPwp0aGlzLk9pOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRWk6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ucTp0aGlzLmdtKGEpfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaG06dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5Hd3x8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MubGwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsCmY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLm9qPWJ9KShjKTt2YXIgTD1jLm9qfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNuPXRoaXMuYVs3XTsKdGhpcy5Vbz10aGlzLmFbMl07dGhpcy5DdT10aGlzLmFbOF07dGhpcy54cz10aGlzLmFbNF07dGhpcy5Fbj10aGlzLmFbNl07dGhpcy5Gbz10aGlzLmFbMl07dGhpcy5Kaz10aGlzLmFbN107dGhpcy5hbD10aGlzLmFbNF07dGhpcy5PcD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs5XX1jLnJvPWI7Yi5wcm90b3R5cGU9e0JuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVW86dGhpcy5CdShhKX0sQnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN1OnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54czp0aGlzLkRuKGEpfSxEbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRW46dGhpcy5FbyhhKX0sRW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkZvOnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLiRrKGEpfSwKJGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFsOnRoaXMuTnAoYSl9LE5wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5PcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucm98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLkJuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuU2w9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5NYT17fTt0aGlzLkk9bnVsbDt0aGlzLktjPTEwMDt0aGlzLkliPTA7dGhpcy5XYT0xNTA7dGhpcy5MYj0wO3RoaXMuanUoYil9LGc6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhPyh0aGlzLkliKyssdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLktjKSk6CjA+dGhpcy5XYSYmKHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5LYykpfSxhdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkliPnRoaXMuV2E/ITA6ITF9LGJmOmZ1bmN0aW9uKCl7dGhpcy5JYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sanU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LEpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuUCgpLCEwKTt0aGlzLk1hW2IubGEoKV09YjtNJiZNLmdoJiZNLlB1KGIpfSxyeDpmdW5jdGlvbigpe3JldHVybiBlLnhlKHRoaXMuTWEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX0sTXI6ZnVuY3Rpb24oYil7Yj1iLkthKCk7Zm9yKHZhciBhIGluIHRoaXMuTWEpaWYoYi5pZD09CnRoaXMuTWFbYV0uS2EoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sSng6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5TbHx8dDsoZnVuY3Rpb24oYyl7Yy5VbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLktjPTEwO3RoaXMuSWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubmE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkJiPSIiO3RoaXMucWc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5LYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxNOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30sCnR1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSxzeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LG11OmZ1bmN0aW9uKGIpe3RoaXMuT2U9Yn0scXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZX0sTmU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhJiYodGhpcy5JYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuS2MpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpOwplbHNlIHJldHVybiExfWNhdGNoKGIpe319LEVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2EoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuYnIoKXx8dGhpcy5ObigpO3RoaXMuQmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSx0eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxObjpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5hYSgxMCkpfSxicjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sVzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj0KYn0sS2E6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmF9LGNhOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMH0sTGM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxJZTpmdW5jdGlvbigpe3JldHVybiExfSxKaDpmdW5jdGlvbihiKXt0aGlzLkJiPWJ9LHB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmJ9LEVoOmZ1bmN0aW9uKCl7dGhpcy5CYj1udWxsfSx2eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuQmImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLnFnfHwodGhpcy5xZz0hMCl9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLlVsfHxwOyhmdW5jdGlvbihjKXtjLnRpPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5JPXRoaXMucGxheWVyPSIiO3RoaXMuTGY9IjEiO3RoaXMuTWY9IjIiO3RoaXMuem49IjMiO3RoaXMuUWM9MDt0aGlzLm5oPQozMDt0aGlzLlJiPVtdO3RoaXMuZ2I9W107dGhpcy5vYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5aZj10aGlzLmZpPSExO3RoaXMuc3RhdHVzPXRoaXMuUWM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLmdmKGIpO3RoaXMua3UoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5maXx8KHRoaXMuZmk9ITAsZS5MZSgpKX0sU2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxEcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5rYSgpXXx8KHdpbmRvd1thLmthKCldPXt9KTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldfHwod2luZG93W2Eua2EoKV1bYi5sYSgpXT17fSx3aW5kb3dbYS5rYSgpXVtiLmxhKCldLmluaXRpYXRvcj0KZS5ZYigpKTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWWIoKV0/d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldKys6d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldPTF9LEpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLmhmKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMueGEoKSl7dGhpcy5EcigpO2lmKCF0aGlzLkpyKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmhmKCk7cmV0dXJufXRoaXMuaGYoKTt0aGlzLkkodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLlpoKCk7dGhpcy5aZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSx1OmZ1bmN0aW9uKGIsCmEpe3RoaXMueGEoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmdiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxaaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuZ2Ipe2Zvcih2YXIgaD0wO2g8dGhpcy5nYi5sZW5ndGg7aCsrKXRoaXMub2NbdGhpcy5nYltoXS5yZWFzb25dPT10aGlzLm9jW2JdJiZhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLHRoaXMub2NbdGhpcy5nYltoXS5yZWFzb25dPHRoaXMub2NbYl0mJihhPVtdLGEucHVzaCh0aGlzLmdiW2hdLmRldGFpbCksYj10aGlzLmdiW2hdLnJlYXNvbik7dGhpcy5vY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITAsYSl9fSx1eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlpmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZn0saGY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxydTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuem59LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5RY30sUmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTGZ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk1mfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5RY30sZ2Y6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxrdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxqczpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMudGl8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR0PXRoaXMuYVsyXTt0aGlzLiRzPXRoaXMuYVsxMF07dGhpcy55dz10aGlzLmFbN107dGhpcy5pbD10aGlzLmFbNl07dGhpcy5Naj10aGlzLmFbN107dGhpcy5Maz10aGlzLmFbMV07dGhpcy5mbz10aGlzLmFbNV07dGhpcy5ncT10aGlzLmFbOV07dGhpcy5tcD10aGlzLmFbOV07dGhpcy5udD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs5XX1jLm1rPWI7Yi5wcm90b3R5cGU9e2N0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kdDp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy54dyhhKX0seHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnl3OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pbDp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5LayhhKX0sS2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5Mazp0aGlzLmVvKGEpfSxlbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZm86dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdxOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5tcDp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLm1rfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5jdCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87CnRoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Uanx8b2E7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLmR4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7CmIuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuVWp8fHBhOyhmdW5jdGlvbihjKXtjLlZqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Wanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmJuPXRoaXMuYVsxXTt0aGlzLm5yPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuQXQ9YjtiLnByb3RvdHlwZT17dW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZtOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLmJuOnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubnI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkF0fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy51bSg0KTsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5xcD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5iYz0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5XKGIpfSwKeGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KSwKYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJgozMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyOwphLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Da3x8c2E7KGZ1bmN0aW9uKGMpe2MuQms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYKKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ29tcGxldGUiKTsKdGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnFwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTt0aGlzLlNlKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMudygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJnRoaXMuVGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy53KCksdGhpcy5yYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sanM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8odGhpcy5yZT50aGlzLnNlJiYoYj0hMSksdGhpcy5HKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSw1MCk6KGEudmcoKSxhLnhnKCksYS5iY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ca3x8dGE7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5HcSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLk1yKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sb3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sR3E6ZnVuY3Rpb24oKXt2YXIgYj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB1YT1jLkRrfHx1YSx2YT1uZXcgdWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFqPXRoaXMuYVsxXTt0aGlzLlR2PXRoaXMuYVs0XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5sbT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLmpsPWI7Yi5wcm90b3R5cGU9e1BqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Rajp0aGlzLlN2KGEpfSxTdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHY6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJzOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMuamx8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlBqKDQpOwooZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0KITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHhhPWMuVm18fHhhOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLkNhPXRoaXMuWGM9ITE7dGhpcy5BaD1lLkhiKDEwKTt0aGlzLmVpPSEwO3RoaXMudGM9dGhpcy5WZz0hMTt0aGlzLkZzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5xaCgpLHRoaXMuWm8oKSx0aGlzLnFiKCkpfSxGczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmNvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLAoiOyIsYi5KP2IuSi5xYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaGU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5oZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkFoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJgoodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxYYjpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSWc6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSwKS3I6ZnVuY3Rpb24oKXtpZighdGhpcy5VZyl7dmFyIGI9dGhpcy55YigpLGE9dGhpcy5JcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVWc9ITApfXJldHVybiB0aGlzLlVnfSxJcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuWGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlhjPSEwKTtyZXR1cm4gdGhpcy5YY30scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLlR0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sVHQ6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuSWcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudWM9ITA7aWYoZS5mYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLnVjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxueDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMubmcmJmIuYWRzJiYodGhpcy5uZz1iLmFkcyk7cmV0dXJuIHRoaXMubmd9LFpvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdhKCEwKTt0aGlzLnUoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5TZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPQohMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLklnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0scWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuS3IoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpOwp0aGlzLnliKCl9ZWxzZSB0aGlzLlZnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpLGI9dGhpcy5YYigpO2EmJiFiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZ2EoKSk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlZnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPQphLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LCRvOmZ1bmN0aW9uKCl7dGhpcy56Y3x8KHRoaXMuemM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnpjIT0KYi5hZHMuc3RhdGUmJih0aGlzLnpjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuemM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRvKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpezA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5laT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5HKHRoaXMuZWksZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGhwOmZ1bmN0aW9uKCl7dGhpcy53eHx8KDEwPHRoaXMuVXY/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5VdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLiR0KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhwKCl9LmJpbmQodGhpcyksNTApKSl9LCR0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlZ2KXt0aGlzLlZ2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciB5YT1jLlVtfHx5YTsoZnVuY3Rpb24oYyl7Yy5XbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5RaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUWgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS54ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwKKG5ldyB5YShhLHRoaXMuSSkpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxUOmZ1bmN0aW9uKCl7dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLktjKX19KX0pKGMpO3ZhciB6YT1jLldtfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGw9dGhpcy5hWzEwXTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm5rPWI7Yi5wcm90b3R5cGU9e0dsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5IbDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLm5rfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuR2woNCk7KGZ1bmN0aW9uKGMpe2MuSmw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5VZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7CmQmJmEmJmEuYWMmJigwPD1oLmluZGV4T2YoZCl8fGEud2QoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlVlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlVlKys7aWYoMTA8dGhpcy5VZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuSmx8fENhOyhmdW5jdGlvbihjKXtjLklsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8Cih0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudGU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5xcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLnFxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucXQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuSWx8fERhOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLktsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXc9dGhpcy5hWzVdO3RoaXMuanY9dGhpcy5hWzNdO3RoaXMuc249dGhpcy5hWzFdO3RoaXMuenM9dGhpcy5hWzddO3RoaXMubW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy5BaT1iO2IucHJvdG90eXBlPXtIdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXc6dGhpcy5pdihhKX0saXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmp2OnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zbjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenM6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9CmMuQWl8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLkh3KDQpOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkZnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMudXQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy51dCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxncDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCkllOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy50a3x8SGE7KGZ1bmN0aW9uKGMpe2Muc2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMuc2t8fElhOyhmdW5jdGlvbihjKXtjLnVrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLnVrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRms9dGhpcy5hWzhdO3RoaXMudHQ9dGhpcy5hWzhdO3RoaXMuT2o9dGhpcy5hWzNdO3RoaXMuUWw9dGhpcy5hWzVdO3RoaXMuR3I9dGhpcy5hWzJdO3RoaXMubHM9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5Saj1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRms6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnR0OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Pajp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWw6dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdyOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMubHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYT1jLlJqfHxMYSxEYz1uZXcgTGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuams9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sbHU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxQbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmprfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmgsZCxmKXt0aGlzLmZiPWE7dGhpcy5BZz10aGlzLm5pPSExO3RoaXMucmg9ZDt0aGlzLlJoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLmZiPW5ldyB6KGEpKTt2YXIgYz10aGlzLnNiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkhlKHRoaXMuZmIudXJsKSYmbS5NZCl7dmFyIGU9bmV3IHooYS51cmwpO2UubHUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uaWEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5raz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5mYi5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5BZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuUmg/dGhpcy5zYi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCExKTp0aGlzLnNiLm9wZW4odGhpcy5mYi5tZXRob2QsdGhpcy5mYi51cmwsITApLHRoaXMubml8fCh0aGlzLnNiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5zYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuc2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuc2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkhlKHRoaXMuZmIudXJsKT9tLk1kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSGUodGhpcy5mYi51cmwpLHRoaXMucmgmJnRoaXMucmgoKX1yZXR1cm4gdGhpcy5zYn19fSkoYyk7dmFyIE1hPWMua2t8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLlZkPSExfWMucGo9YjtiLnByb3RvdHlwZT17cHU6ZnVuY3Rpb24oYSl7dGhpcy5WZD1hfSxvdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LFl0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e053OiJBZENsaWNrVGhydSIsUHc6IkFkRXJyb3IiLFF3OiJBZFN0b3BwZWQiLFR3OiJBZExpbmVhckNoYW5nZSIsVXc6IkFkVGFnUGFyc2VkIixYdzoiQWRWaWRlb0NvbXBsZXRlIiwkdzoiQWRMb2FkZWQiLGF4OiJBZFNraXBwZWQiLGJ4OiJBZFN0YXJ0ZWQiLFJ3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsU3c6IkFkSW1wcmVzc2lvbiIsT3c6IkFkQ3JlYXRpdmVWaWV3IixWdzoiQWRWaWRlb01pZHBvaW50IixXdzoiQWRQYXVzZWQiLFl3OiJBZFZpZGVvU3RhcnQiLFp3OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuVmQsYltkXSl9LFh0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVWQpZm9yKHZhciBiIGluIHRoaXMuSGEuVWQpdGhpcy5IYS5VZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVWRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuVmQmJnRoaXMuWXQoKTt0aGlzLkhhJiZ0aGlzLlh0KCl9fX0pKGMpO3ZhciBOYT1jLnBqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmllPQp0aGlzLnZjPXRoaXMud2I9bnVsbDt0aGlzLkNwPXRoaXMuSmI9dGhpcy5paD0hMTt0aGlzLkxhPSIiO3RoaXMuZGg9ITE7dGhpcy53YT10aGlzLm9kPSIiO3RoaXMuWmc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuJGU9ITE7dGhpcy5wYT1bXTt0aGlzLk9nPXRoaXMuZmM9IiI7dGhpcy5xZT0hMTt0aGlzLnFmPTA7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuSWQ9W107dGhpcy5nYz0iIjt0aGlzLnJmPTA7dGhpcy52aWRlb3BsYXphPQp7fTt0aGlzLkRjPSExO3RoaXMuaXA9dGhpcy5PZD1udWxsO3RoaXMuTGg9dGhpcy5sYz10aGlzLnNnPXRoaXMudWY9dGhpcy5NZD10aGlzLmtlPXRoaXMuUmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5wZD0wO3RoaXMuUWc9ITE7dGhpcy5QZz0xRTM7dGhpcy5aYz0hMTt0aGlzLlFhPTFFMzt0aGlzLk9mPSIifWMubGs9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy53YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLnZjLGFkdGFncmVnZXg6dGhpcy5pZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5paCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5DcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmRoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLndhLAppc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuWmcsc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZmMsaG9tYWRBZHBhdGg6dGhpcy5PZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnFmLEhPTUFEX1ZFUklGSUVEOnRoaXMuR2YsSE9NQURfQkxPQ0tFRDp0aGlzLkVmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm5jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5GZix0ZXN0SGlkZTp0aGlzLmhjLHRlc3RUYWdzOnRoaXMuaWMsdGVzdFRhZ3NKUzp0aGlzLmpjLHRlc3RUYWdzWEhSOnRoaXMuSWQsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMucmYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmlwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUmMsCmJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5rZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5NZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy51Zixjb25maWdGYWlsdXJlczp0aGlzLmhiLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLkloLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5qYix2cGFpZDp0aGlzLmxjLHNraXBBbGxvd2VkOnRoaXMuTGgsdm1hcHM6dGhpcy5raSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuWmMsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sJHE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmKGE9ITApO3JldHVybiBhfSxlZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSxIcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2JdJiYxPT10aGlzLmhiW2JdJiZhLnB1c2goYik7CnJldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLktvKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuR2UoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuRmMoKT9lPWE6ZT1jLnByb3RvY29sKwoiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLkpjKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMud2N8fHRoaXMud2J8fHRoaXMudmN8fHRoaXMuaWUpJiYoZz10aGlzLnJzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuSXEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxHZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT8KYj0hMDp0aGlzLkZjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxGYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5HZShhKTtyZXR1cm4gYn0sSXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PQp0eXBlb2YgdGhpcy5MYSYmMDx0aGlzLkxhLmxlbmd0aClyZXR1cm4gdGhpcy5MYTtmb3IoZCBpbiB0aGlzLkxhKWlmKGI9dGhpcy5MYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLml4O3JldHVybiJub25lIn0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLkloXX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnFkKCksYj10aGlzLktoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LG9oOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LHFzOmZ1bmN0aW9uKGEsCmIpe3ZhciBkPWUuemEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLm9oKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5vaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LHJzOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJgooYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy52YyYmKGE9dGhpcy5xcyhhLHRoaXMudmMpKTtyZXR1cm4gYX0sZnA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuYXAodGhpcy5GYS5jbGllbnRBUElzKX0sYXA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLnB1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5vdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5kaD0hMDt0aGlzLm9kPWE7dGhpcy53YT1iO3RoaXMuJGU9ZDt0aGlzLk9kPWY7dGhpcy5BYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5mcCgpO3RoaXMuZXMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5jcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLndhKXRyeXt0aGlzLndhPWIsdGhpcy54YygpfWNhdGNoKGspe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9fSxwYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sZXM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMub2QrdGhpcy5mZSgiZ2xvYmFsIikpLHRoaXMuV3EuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sY3M6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5mZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sZmU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2Upe3RoaXMua2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQWM9ITEpO3RoaXMuQWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5BYz90aGlzLkFjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5aZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuRWYpKTt0aGlzLk5iKCk7ZS5CYyhrLmp0KTsoYj1lLlpiKHRoaXMucWQoKSkpfHwoYj1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxXcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZmN8fHRoaXMuTGF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8Cm51bGw7dGhpcy5PZz1hLmFkcGF0aHx8IiI7dGhpcy5xZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkloPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZmMmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuR2MoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEdjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuSmMoKSksZD10aGlzLnphKHRoaXMuZmMpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPQoiUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuZmMrdGhpcy5mZSgiY3VzdG9tZXIiKSk7dGhpcy5EYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImN1c3RvbWVyIik7YT90aGlzLmVtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZW09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxTdTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkRjPSEwO3RoaXMuR2MoITApO3JldHVybn19dGhpcy5NZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuc2c9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmpiPQp0aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaGM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5qYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy53Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnZjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5pZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5paD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmxjPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5sYzt0aGlzLkxoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuJGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmtpPWIudm1hcHN8fCIiO3RoaXMuWmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8CjFFMzt0aGlzLk9mPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmdjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuUHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnFlJiYodGhpcy5nYz1udWxsKTt0aGlzLnJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkRjPSEwLHRoaXMuR2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMubXYoKSYmKHRoaXMuaGN8fHRoaXMuamN8fHRoaXMuaWN8fHRoaXMuZ2N8fHRoaXMuSWQpP3RoaXMuJGU/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSksdGhpcy5tZSgpLHRoaXMuTmIoKSk6dGhpcy5ZdSgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlp1KCkpfX0sWXU6ZnVuY3Rpb24oKXt0aGlzLlh1KCk7CnRoaXMuJHUoKX0sJHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsCiIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9CmQpe3ZhciBjPWUuaGQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxadTpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpO3RoaXMuTmIoKX0sT2M6ZnVuY3Rpb24oYSl7dGhpcy5SYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIoYSkpLHRoaXMuTmIoKSx0aGlzLm1lKCkpfSxYdTpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmhoKCkpdGhpcy5PYyh0aGlzLm5jLAoibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5WaCgpfX1lbHNlIHRoaXMuVmgoKX0sVWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLkhiKCkpO3RoaXMuY3YoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm5mLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuaWM9dGhpcy5JZCkmJnRoaXMuaWMubGVuZ3RoKXt2YXIgZD10aGlzLmljLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubmYoKX0sY3Y6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGMsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5VaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5qYyYmdGhpcy5qYy5sZW5ndGgpe3ZhciBkPXRoaXMuamMuc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5VaCgpfSxkdjpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nYz8odGhpcy5xZisrLHRoaXMuRGEobmV3IHoodGhpcy5nYyksdGhpcy5XdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5vZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlNoKCl9LG9mOmZ1bmN0aW9uKGEpe3RoaXMuT2ModGhpcy5GZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LFd1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnFmP3RoaXMubmYoKTp0aGlzLm9mKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuU2goKTp0aGlzLm9mKCJBQUEiKX0sU2g6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5tZSgpfSxoaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUmMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaGgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5PZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk9kJiZ0aGlzLk9kKCl9LGVwOmZ1bmN0aW9uKCl7aWYodGhpcy51ZiYmdGhpcy4kcSgpKXt2YXIgYT10aGlzLkhxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxaaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnBkfHwodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlBnJiYhdGhpcy5RZyYmKHRoaXMuUWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlBnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5uaT0hMCk7cSYmZS5OcigpJiYoYS5BZz0hMCk7ZyYmKGEuUmg9ITApO3JldHVybiBhLmxvYWQoKX0sYnA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxWdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMua2l9LGNwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMuSXYuYmluZCh0aGlzKSx0aGlzLkh2LmJpbmQodGhpcykpfSxJdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMubHEoKX0sSHY6ZnVuY3Rpb24oKXt9LApscTpmdW5jdGlvbigpe2UuQmMoay5rcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYWIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxtdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnJmfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmxrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucG09dGhpcy5hWzFdO3RoaXMuQ209dGhpcy5hWzJdO3RoaXMueGw9dGhpcy5hWzRdO3RoaXMuQ3Q9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMl19Yy5aaj1iO2IucHJvdG90eXBlPXtvbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucG06dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNtOnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueGw6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMuWmp8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLm9tKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmJiPWEuZi5QKCk6dGhpcy5iYj0iIjthLmYuWGcmJmEuZi5YZyh7cGF1c2U6dGhpcy53ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkdoLmJpbmQodGhpcyksbXV0ZTp0aGlzLlBlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuQXYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5pYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlZiPXRoaXMuWWM9ITE7dGhpcy5Jbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkZkPXt9O2Uub2IoIm5ld0JpZ0FkSWQiKTt0aGlzLkxvPWUuYWEoMTApO3RoaXMubGY9MDt0aGlzLldjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuV2M9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYKKGE9dGhpcy5iLmYucygpKSx0aGlzLldjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlZuPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuc2g9dGhpcy5FZD0hMTt0aGlzLmxoPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5lZT0hMTt0aGlzLmJpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYWM9ITE7dGhpcy5zcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5NaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5QZD10aGlzLk9iPXRoaXMub2U9dGhpcy5lZD10aGlzLkdkPXRoaXMucmI9dGhpcy5tYz10aGlzLnVoPXRoaXMua2Q9dGhpcy5udj10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5yYz1bXTt0aGlzLmNjPXt9O3RoaXMuZ3Q9MjAwO3RoaXMuQmY9CnRoaXMuQ2Y9dGhpcy5qZT10aGlzLkFmPXRoaXMuWmU9ITE7dGhpcy52ZD17fX1jLmZrPWI7Yi5wcm90b3R5cGU9e2d1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGJ9LCRoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkNiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5MdSgpO2UudihrLkxuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEtlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5sZisrLGUub2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5lcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJgp0aGlzLkwuaXNFbmFibGVkPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmxjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuJGgoKSxuZXcgUyh0aGlzLGEsdGhpcy5saCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5sYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7CmVsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLktlKGEsYixjKX0sNTApfX0sVmU6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5rZD0hMTt0aGlzLmM9YTt0aGlzLnV1KHRoaXMuYyk7dGhpcy52ZD1uZXcgUWEodGhpcy5jLkt2LHRoaXMudmlkZW8se30pO3RoaXMuTGcoYSk7dGhpcy5yYz10aGlzLkNnKGEpO3RoaXMubnAoKX0sTGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuRmQ9dGhpcy5TcShhKSksdGhpcy5MZyhhLnBhcmVudCkpfSxDZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuQ2coYS5wYXJlbnQpKSxjLnB1c2godGhpcy5DcShhKSkpO3JldHVybiBjfSwKQ3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LFNxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8CmYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5rYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZ2QmJmEuZ2QuZXJyb3ImJmEuZ2QuZXJyb3IuY29kZSYmKGI9YS5nZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlBjLmNvZGU6Yj09Ry5XZC5jb2RlP2UudihrLmh3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpOihlLkxlKCksYj09Ry5KZi5jb2RlJiZlLnYoay5Hcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5qcSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuTXUoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmUudihrLkp2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLnYoay5wdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUudihrLnd3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5Icyx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsuRnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsuR3YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuV2IoYSk7dGhpcy5SYSgpfSxXYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLkplKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSx1dTpmdW5jdGlvbihhKXt0aGlzLm9lPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTsKdGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5aZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLkl4PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7CnRoaXMuVm4mJnRoaXMucGxheWVyLnVlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci51ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuUW4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLlplJiZiLmxvYWQoKTtpZih0aGlzLldoKGIpKXt0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt0aGlzLlRuKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5aZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz0KdGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLm9wKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5zdSgpKTp0aGlzLmMub3JpZ2luLnRnKHcuVGQpfSxzdTpmdW5jdGlvbigpe3RoaXMuQWY9ITA7dGhpcy5yYj10aGlzLm1jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnJiPSEwKTtlLm5lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlVuKHRoaXMuYy5vcmlnaW4udmEpOwp0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnZoKCk7dGhpcy5iLmpmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5qZigpO3RoaXMudGE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmdpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuVnEoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuY2coImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmdlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuR2QmJnRoaXMuYi5mLkFhKCkmJmUudihrLnljLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi4kYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5yYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuWHYoKSx0aGlzLmIuJGIoITApLCF0aGlzLk9iKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsCmNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLiRiKCEwKSx0aGlzLmV3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN3KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR3KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZncoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuYncoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubGkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9CmEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlViKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmtnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5aYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuYmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT0KYS5kYXRhLm5hbWUmJih0aGlzLkNmJiYodGhpcy5CZj0hMSx0aGlzLmVjKCkpLHRoaXMuWnYoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnJiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpOwplLmdlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuZ2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuJGYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubWM9ITB9LFp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSk7dGhpcy5tYz0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLk9oKCk7ZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sZXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sY3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5rZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSl9LGR3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxidzpmdW5jdGlvbigpe3RoaXMud2YoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxsaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm5lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSwKV3Y6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmd3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5saSghMCl9LFFuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5GYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5Sdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LApXaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sVG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxBZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5oaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxoaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMueWYoYSl9LmJpbmQodGhpcyksdGhpcy5JbykpfSx5ZjpmdW5jdGlvbihhKXtpZighdGhpcy5ZYyYmdGhpcy5XaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLlZiKXt0aGlzLlljPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5BZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnNnfHwKdGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuT3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5qZigpO3RoaXMuTnYoKTt0aGlzLmdpKCk7dGhpcy5kZygpO3RoaXMuYi52aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5tZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLmVkfHx0aGlzLlFmKCl9LFFmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZWR8fChhP3RoaXMuUmEoKToodGhpcy5QZSghMCksdGhpcy5RZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0uYmluZCh0aGlzKTt0aGlzLndlKCkuSmgodGhpcyl9LHdmOmZ1bmN0aW9uKCl7dGhpcy5MLmpiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkpuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxNbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkdnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuSnUoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlFkJiZ0aGlzLk1uKHRoaXMuYy5RZCk7CmlmKCF0aGlzLm9lKWlmKHRoaXMub2U9ITAsdGhpcy5QZHx8KGUudihrLkpzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucGMpe2Uub2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMubGYrKzt0aGlzLlZiPXRoaXMuWWM9ITE7dHJ5e3RoaXMuQWQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkVkPSExO3RyeXt0aGlzLmIuZGkoKX1jYXRjaChnKXt9dGhpcy5HZD0hMDt0aGlzLmIuQWUoKTt0aGlzLmFjPSExO3RoaXMud2UoKS5FaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5RZSgpO3RoaXMuYy5wYyYmKGE/dGhpcy5jLm9yaWdpbi5waCgpOnRoaXMucGUoKSl9ZWxzZSB0aGlzLnBlKCl9LApSdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMueGYoYSkpfSx4ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5icCgpO3RoaXMuYy5vcmlnaW4udGcody5UZCl9LGlpOmZ1bmN0aW9uKCl7aWYodGhpcy5udil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5HZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsueWMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnJ2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlBkPSEwO2UudihrLmppLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkZlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmtmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1oKSkmJihjPXRoaXMuYy5rZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuRWR8fCh0aGlzLkVkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLldmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLlZiPXRoaXMuWWM9ITEsdGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkVkPSExLHRoaXMuYi5kaSgpLHRoaXMuYy5vcmlnaW4uUWUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5XYy5yZXBsYWNlKCJbdGltZV0iLGUuQmcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5lZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGFpOmZ1bmN0aW9uKCl7dGhpcy51aHx8KHRoaXMudWg9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2UudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5iaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmFpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5haSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLk9oKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwuamImJgp0aGlzLllhKCJzdGFydCIpLGUudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlBmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKgp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmJpPWEpfSxOaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sTHU6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LE9oOmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxNdTpmdW5jdGlvbigpe2UuS2QoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLktkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5BZnx8dGhpcy5MLmpiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmpiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMudmQmJnRoaXMudmQudHJhY2smJnRoaXMudmQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuVHEodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5qZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkZkLmltcHJlc3Npb25zJiYKZS5McihnLnVybCx0aGlzLkZkLmltcHJlc3Npb25zKT90aGlzLkplKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Lbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5GZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSmUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnlwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5BZiYmKGI9Il92cGFpZCIpO3RoaXMuQ2YmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sSmU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5QbihjKSxmfHwKKGY9dGhpcy5yZyksZXx8KGU9dGhpcy5yZyksdGhpcy5SbihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LERoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LG5wOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sT3U6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuY2NbYl0mJmErKztyZXR1cm4gYX0sVHE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx5cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLlB2LmJpbmQodGhpcykpfSxQdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sTnY6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuV2MucmVwbGFjZSgiW3RpbWVdIixlLkJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuJGMmJihiPXRoaXMuTC4kYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLAoxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZ2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnNwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLApmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlhoLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06CihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnF2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucHYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgoobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuTWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5rZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwKKHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksCmMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlBlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQmZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx3ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sR2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0scHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LHF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5yYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnJiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5yYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxQZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm1mKCkpfSxwZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmplJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnNofHwhdGhpcy5MLlJjJiYic3BpZWdlbC5kZSIhPWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5lZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm1nKCkpOih0aGlzLnNoPXRoaXMuQ2Y9dGhpcy5CZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmplPSEwLGE9ZS5jZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5LZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbWc6ZnVuY3Rpb24oYSl7dGhpcy5PdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoITApfS5iaW5kKHRoaXMpLHRoaXMuZ3QpOih0aGlzLkdkPSEwLHRoaXMuYi5BZSgpLHRoaXMuYi5idSgpLHRoaXMuYWM9ITEsCmUudihrLnJwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy53ZSgpLkVoKCkpfSx3ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkVlKHRoaXMudmlkZW8sYSk/dGhpcy5HaCgpOnRoaXMud2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5VYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnJjJiYwPHRoaXMucmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnJjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5MbysiLSIrdGhpcy5sZjt0aGlzLmMmJnRoaXMuYy5IZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSGcoKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ma3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGo9dGhpcy5hWzVdO3RoaXMua289dGhpcy5hWzJdO3RoaXMuUnM9dGhpcy5hWzhdO3RoaXMubHc9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy50bj1iO2IucHJvdG90eXBlPXtzajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGo6dGhpcy5qbyhhKX0sam86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmtvOgp0aGlzLlFzKGEpfSxRczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnM6dGhpcy5rdyhhKX0sa3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmx3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy50bnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuc2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLmhzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLlNtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmhkKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5EYShiLHRoaXMuZ3MuYmluZCh0aGlzKSx0aGlzLmRzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5RcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5WdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxRcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuTHQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9CnRoaXMuRGcoKTt0aGlzLnNjPXRoaXMucGYoKTt0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEucmVzcG9uc2VVUkw7dGhpcy5ZLmxlbmd0aD90aGlzLkljKCk6dGhpcy5zYSh0aGlzLlNhKHcuUGMse2Vycm9yOnRoaXMuemY/Ry5XZDpHLklmfSkpfSxoczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpO3RoaXMucWM9dGhpcy5UaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sZHM6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5IZix7ZGVwdGg6YX0pKX0sSWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5TcigpP3RoaXMuZXYoKT8oYSsrLApuZXcgYih0aGlzLHRoaXMuTWcoKSxoLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMuc2EodGhpcy5TYSh3LktmKSk6KGE9MCx0aGlzLkR2KCkmJnRoaXMuVmUodGhpcy53cCgpKSl9LFFlOmZ1bmN0aW9uKCl7dGhpcy5zYz8odGhpcy5zYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5RZSgpfSxwaDpmdW5jdGlvbigpe3RoaXMucWM/KHRoaXMucWM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQucGgoKX0sRHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idigpP3RoaXMuYXYoKT8hMDooLTEhPXRoaXMuQ2MoKT90aGlzLnNhKHRoaXMuU2Eody5TZCkpOnRoaXMuc2EodGhpcy5TYSh3LkRmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5QYyxHLkpmKSksITEpfSxWZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5RZHx8KGEuUWQ9CltdKTthLlFkLnB1c2godGhpcy5TZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk1lKCkpO2EudGI9YS50Yj9hLnRiOnRoaXMuc2M7YS5wYz1hLnBjP2EucGM6dGhpcy5xYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5wYXJlbnQuVmUoYSl9LHdwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuQ2MoKTthLk89dGhpcy5KZygpO2EuVWI9dGhpcy5EcSgpO2EuS3Y9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5BcSgpO2Eua2Y9dGhpcy5ScShhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLnpnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT13LlNkLmNvZGU/Yi5QYS5jb25jYXQodGhpcy5FcSgpKTpiLlBhLmNvbmNhdCh0aGlzLk1xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuV2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sZXY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxidjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuSmcoKS5sZW5ndGh9LAphdjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQ2MoKX0scGY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxUaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucGYoKSYmKGE9ITApO3JldHVybiBhfSxMdDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk1nKCkubGVuZ3RofSxNZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwKIlZBU1RBZFRhZ1VSSSIpfSxCcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwiQWRTeXN0ZW0iKX0sTWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy4kZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LCRnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuJGcoYS5wYXJlbnROb2RlKToKITF9LE1xOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxEcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxKZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSwKang6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsCmM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMubmQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LENjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxScTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd1KGQsYSksMD5iJiYKKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLlNtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllrPXRoaXMuYVszXTt0aGlzLk1zPQp0aGlzLmFbN107dGhpcy5rcD10aGlzLmFbMTBdO3RoaXMuWm49dGhpcy5hWzddO3RoaXMucHQ9dGhpcy5hWzVdO3RoaXMuVXU9dGhpcy5hWzhdO3RoaXMueHY9dGhpcy5hWzEwXTt0aGlzLnlrPXRoaXMuYVs3XTt0aGlzLmh2PXRoaXMuYVs4XTt0aGlzLnZpPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuWXA9YjtiLnByb3RvdHlwZT17WGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zazp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTXM6dGhpcy5qcChhKX0sanA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtwOnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abjp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucHQ6dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV1OnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy54djoKdGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlrOnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5odjp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLllwfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Yayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlViPSIiO3RoaXMuQj10aGlzLnBjPXRoaXMudGI9ITE7dGhpcy5CZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuQ2U9IiJ9Yy5SbD1iO2IucHJvdG90eXBlPXtvcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSwKYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxLcTpmdW5jdGlvbigpe2lmKCF0aGlzLkJlJiYKdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkdhKXt2YXIgYT10aGlzLm9yaWdpbi5HYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkJlPWFbY10pfXJldHVybiB0aGlzLkJlfSxIZzpmdW5jdGlvbigpe2lmKHRoaXMuQ2UpcmV0dXJuIHRoaXMuQ2U7dmFyIGE9IiI7KGE9dGhpcy5LcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuQ2U9YX0sVnE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLlJsfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuaW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMV19Yy5pdD1iO2IucHJvdG90eXBlPXtobzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLml0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5obyg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LERmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxQYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCk9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEx3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSWk9dGhpcy5hWzldO3RoaXMuQXc9dGhpcy5hWzEwXTt0aGlzLnlyPXRoaXMuYVsyXTt0aGlzLkFyPXRoaXMuYVsxXTt0aGlzLnZ3PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuSXA9YjtiLnByb3RvdHlwZT17SGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklpOnRoaXMuencoYSl9LHp3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bdzp0aGlzLnhyKGEpfSx4cjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXI6dGhpcy56cihhKX0senI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Bcjp0aGlzLnV3KGEpfSx1dzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLklwfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5IaSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmdkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuU2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlNqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zcj10aGlzLmFbMTBdO3RoaXMuVmk9dGhpcy5hWzFdO3RoaXMubG49dGhpcy5hWzRdO3RoaXMueHE9CnRoaXMuYVszXTt0aGlzLlVyPXRoaXMuYVs0XTt0aGlzLkN2PXRoaXMuYVsxXTt0aGlzLmpqPXRoaXMuYVs4XTt0aGlzLnltPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuenQ9YjtiLnByb3RvdHlwZT17WHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLllyOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5WaTp0aGlzLmtuKGEpfSxrbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubG46dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhxOnRoaXMuVHIoYSl9LFRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vcjp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy55bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLnp0fHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5Ycig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuRmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5OZD1bXTt0aGlzLkNoPVtdO3RoaXMuUmU9W107dGhpcy5Rdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMuWms9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5GaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZoW2FdLApjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLkV4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlp0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLlF0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz0KYztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuTmQucHVzaCh7c3JjOmMsZnJhbWU6ZyxodDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5SZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlJlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy5GcShhKSl9fSxGcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntOeDohMCxNeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntBeDoidmlkZW8iLFB4OiJqc0N1c3RvbSIsUXg6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxSeDoxLApreDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LFVxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5OZC5sZW5ndGg7YisrKWlmKHRoaXMuTmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5OZFtiXS5odDtyZXR1cm4iIn0sWnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkNoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlVxKGIpLHZlbmRvcjpifSk7dGhpcy5LdSgpfSxRdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuUXYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSwKYil9LmJpbmQodGhpcykpOnRoaXMuYWcoYSxiKX0sYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLlJlLnB1c2goe3R5cGU6YSxWbzpiLEt4OiExfSl9LEt1OmZ1bmN0aW9uKCl7dGhpcy5DaC5tYXAoZnVuY3Rpb24oYSl7YS5Pcnx8KGEuRHgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLk94LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Pcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5aa3x8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXU9dGhpcy5hWzldO3RoaXMub3c9dGhpcy5hWzhdO3RoaXMud3U9dGhpcy5hWzldO3RoaXMuc2w9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5vcj1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmV1OnRoaXMubncoYSl9LG53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vdzp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud3U6dGhpcy5ybChhKX0scmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnNsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5vcnx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuZHUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5pYj1hLkVnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmJnPSExO3RoaXMuVGI9W119Yy51aj1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnpxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5rcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDsKZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUnU6ZnVuY3Rpb24oKXt0aGlzLmJnPSEwfSxkaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5mLnMoKSl9LGJ1OmZ1bmN0aW9uKCl7dGhpcy5iZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZGQsdGhpcy5mLnMoKSkpfSxqZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5pYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5pYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTt0aGlzLmYuTGMmJnRoaXMuZi5MYygpP3RoaXMuZi5FZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LGtyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx0cTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249Yi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSwkYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRxKHRoaXMuaWIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQWUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkxjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9CmIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUuUGgodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy4kYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEFlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTsKZm9yKHZhciAkYT1jLnVqfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy4kcD10aGlzLmFbMV07dGhpcy5Cbz10aGlzLmFbNF07dGhpcy5NbD10aGlzLmFbNF07dGhpcy54bj10aGlzLmFbMV07dGhpcy5Ybj10aGlzLmFbNF07dGhpcy52dj0KdGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5pdz1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMub286dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRwOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cbzp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWw6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhuOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ybjp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudnY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5pd3x8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLm5vKDQpOyhmdW5jdGlvbihjKXtjLkRsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5CZChiKTt0aGlzLnBnKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKSl9LApwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxBYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkOwpiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGNiPWMuRGx8fGNiOyhmdW5jdGlvbihjKXtjLkNsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kYSgpO3RoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5UZj10aGlzLlZmPXRoaXMuV2c9dGhpcy5lYT10aGlzLnNmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuV2cmJnRoaXMuamcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmYS5hYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmJkKCk7dGhpcy5XZz0hMDt0aGlzLmpnKCl9LmJpbmQodGhpcykpO3RoaXMuZmcoKX0samc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5iZCgpO2lmKCF0aGlzLnNmJiYhdGhpcy5iZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuc2YmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LApLZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxmZzpmdW5jdGlvbigpe2lmKHRoaXMuYmQoKSl7dmFyIGI9dGhpcy5LZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9Yi5oeH10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LGx4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLnl4KCk6ITF9LENjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/CmIuQ2MoKTotMX0sTnE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLlNiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5EZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLk5xKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBkYj1jLkNsfHxkYjsoZnVuY3Rpb24oYyl7Yy5FbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFByOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlZsLkFuLnluP3dpbmRvdy5PTy5WbC5Bbi55bi5meChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnhlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYywKdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBlYj1jLkVsfHxlYixmYj1uZXcgZWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXA9dGhpcy5hWzhdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuYWo9dGhpcy5hWzFdO3RoaXMuZHI9dGhpcy5hWzRdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMuaHI9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzhdO3RoaXMucGs9dGhpcy5hWzNdO3RoaXMuR2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbN119Yy5GcD1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuJGkoYSl9LCRpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5hajp0aGlzLmNyKGEpfSxjcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhPwp0aGlzLmRyOnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kbjp0aGlzLmdyKGEpfSxncjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaHI6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnVyOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wazp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5GcHx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuRHAoNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk5nKCl9LApOZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy55aCgpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuZmp8fGhiOyhmdW5jdGlvbihjKXtjLmVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSwKdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmdnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2coYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuZWp8fGliOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCkJoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zcXx8KHRoaXMuc3E9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkJoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5CaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuZ2p8fGpiLFQ9bmV3IGpiKHIpO1QuZygpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xbD10aGlzLmFbOF07dGhpcy5zcj10aGlzLmFbNV07dGhpcy5JdT10aGlzLmFbMTBdO3RoaXMuY289dGhpcy5hWzldO3RoaXMuRnc9dGhpcy5hWzhdO3RoaXMuR209dGhpcy5hWzhdO3RoaXMuQ2o9dGhpcy5hWzhdO3RoaXMuam49dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMV19Yy50cD1iO2IucHJvdG90eXBlPXtwbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWw6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNyOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JdTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY286dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZ3OnRoaXMuRm0oYSl9LEZtOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuR206dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMudHB8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnBsKDQpOyhmdW5jdGlvbihjKXtjLnJtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ybXx8VTsoZnVuY3Rpb24oYyl7Yy5xbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIisKYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guVmMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5OcyhhKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5acSgpfSxOczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7CnJldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn19dGhpcy51KCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMucW18fFY7KGZ1bmN0aW9uKGMpe2Muc209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUuQnAoYix0aGlzLnVkKSk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMudWR8fCh0aGlzLnVkPVtdKSx0aGlzLnVkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSwKZnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5IY3x8KHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChiKSx0aGlzLmF1KCkmJih0aGlzLmJmKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LFpxOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGI9MDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPQowO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LmZ2KGIpfX0pfSkoYyk7dmFyIGxiPWMuc218fGxiLHg9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWo9dGhpcy5hWzhdO3RoaXMuU2k9dGhpcy5hWzJdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMuYnM9dGhpcy5hWzJdO3RoaXMuem89dGhpcy5hWzNdO3RoaXMuZXE9dGhpcy5hWzNdO3RoaXMuYW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNl19Yy5MbT1iO2IucHJvdG90eXBlPXt6ajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFqOnRoaXMuUmkoYSl9LApSaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU2k6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBvOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5iczp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem86dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVxOnRoaXMuJG4oYSl9LCRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1iPWMuTG18fG1iLE9jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLnpqKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7CnRoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LEFhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuYmp8fG5iOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLmNqfHxvYjsoZnVuY3Rpb24oYyl7Yy5kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTihnKXx8Cih0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLmRqfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzldO3RoaXMuQWs9dGhpcy5hWzldO3RoaXMuS2o9dGhpcy5hWzJdO3RoaXMuZnI9dGhpcy5hWzRdO3RoaXMuUWs9dGhpcy5hWzEwXTt0aGlzLndqPXRoaXMuYVs1XTt0aGlzLmlxPXRoaXMuYVs5XTt0aGlzLkN3PXRoaXMuYVszXTt0aGlzLkl0PXRoaXMuYVsxMF07dGhpcy5WcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX0KYy5Xbz1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ0OnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuS2o6dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZyOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Razp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2o6dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pcTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3c6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkl0OnRoaXMuVXAoYSl9LFVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5Xb3x8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuZXQoNCk7KGZ1bmN0aW9uKGMpe2MudWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuUHQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sUHQ6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiYKdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFhnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMudWx8fHNiOyhmdW5jdGlvbihjKXtjLnRsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5taT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5taSYmKHRoaXMuRygpLHRoaXMubWk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnRsfHx0YjsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBiPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy52bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLnhpPXRoaXMuYVsxXTt0aGlzLnZxPXRoaXMuYVszXTt0aGlzLndyPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuU3M9YjtiLnByb3RvdHlwZT17ZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVrOnRoaXMud2koYSl9LAp3aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGk6dGhpcy51cShhKX0sdXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZxOnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy53cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuU3N8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmRrKDQpOyhmdW5jdGlvbihjKXtjLlltPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7CnZhciB3Yj1jLlltfHx3YjsoZnVuY3Rpb24oYyl7Yy5YbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxYYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sTnQ6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy50Yz0KITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5OdCh0aGlzLkNhKToodGhpcy5DYT10aGlzLlhiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpO3JldHVybn1pZighdGhpcy50Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTsKZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLlhtfHx4YjsoZnVuY3Rpb24oYyl7Yy5abT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuWm18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudnA9dGhpcy5hWzVdO3RoaXMuUG09dGhpcy5hWzEwXTt0aGlzLnBzPXRoaXMuYVs2XTt0aGlzLmRsPXRoaXMuYVszXTt0aGlzLk1pPXRoaXMuYVsyXTt0aGlzLkNpPXRoaXMuYVs5XTt0aGlzLmFtPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVsyXTt0aGlzLnFvPXRoaXMuYVszXTt0aGlzLm9sPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuWnI9YjtiLnByb3RvdHlwZT17dXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZwOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QbTp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucHM6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NaTp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ2k6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5hbTp0aGlzLnptKGEpfSx6bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQW06dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFvOnRoaXMubmwoYSl9LG5sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuWnJ8fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLnVwKDQpOyhmdW5jdGlvbihjKXtjLmNtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5XZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucnQoKX0uYmluZCh0aGlzKSw1MDApfSxydDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLldlJiYKd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LE51OmZ1bmN0aW9uKCl7dGhpcy5XZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuY218fEJiOyhmdW5jdGlvbihjKXtjLmJtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ucz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMua2N8fCh0aGlzLmtjPQowLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5ucz8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuTnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLmJtfHxDYjsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuZG18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bj10aGlzLmFbM107dGhpcy5qbT10aGlzLmFbNl07CnRoaXMuU2s9dGhpcy5hWzNdO3RoaXMuQ3I9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5XbD1iO2IucHJvdG90eXBlPXt1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5pbShhKX0saW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmptOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tazp0aGlzLkJyKGEpfSxCcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLldsfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1TYy51big0KTsoZnVuY3Rpb24oYyl7Yy5ZbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5ZbHx8R2I7KGZ1bmN0aW9uKGMpe2MuWGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuS2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnBwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMubWQoKTsKMDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy4kcigpOnRoaXMuaWcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxwcDpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5tKCEwKX0sJHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7IWIucWEmJmIuWSYmYi5leCYmYi5neCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGlnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PQpiPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCl9LmJpbmQodGhpcyksMTAwKX0sbWQ6ZnVuY3Rpb24oKXtpZighdGhpcy50aClmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuS2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudGg9YltjXSk7cmV0dXJuIHRoaXMudGh9LHp4OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLm1kKCkuYWRzTG9hZGVyP3RoaXMuRyghMCk6dGhpcy5HKCk6dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBIYj1jLlhsfHxIYjsoZnVuY3Rpb24oYyl7Yy5abD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgSGIoYyx0aGlzLkkpKS5nKCkpfXJldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgSWI9Yy5abHx8SWIsSmI9bmV3IEliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBxPXRoaXMuYVsxMF07dGhpcy5xcj10aGlzLmFbN107dGhpcy5PbD10aGlzLmFbMTBdO3RoaXMuRXQ9dGhpcy5hWzhdOwp0aGlzLnR3PXRoaXMuYVsxMF07dGhpcy50dj10aGlzLmFbOF07dGhpcy5CbD10aGlzLmFbM107dGhpcy5saj10aGlzLmFbM107dGhpcy5ubT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLnhwPWI7Yi5wcm90b3R5cGU9e29xOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wcTp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXI6dGhpcy5ObChhKX0sTmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9sOnRoaXMuRHQoYSl9LER0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5FdDp0aGlzLnN3KGEpfSxzdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHc6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR2OnRoaXMuQWwoYSl9LEFsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CbDp0aGlzLmtqKGEpfSxrajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGo6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMubm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnhwfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5vcSg0KTsoZnVuY3Rpb24oYyl7Yy5Waz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7SCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlcoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LAp4eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Wa3x8WDsoZnVuY3Rpb24oYyl7Yy5Vaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhlPWIuaWQpO0g/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGUmJmIhPXRoaXMuWGV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmCiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkZ4KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy51KCJhZGVycm9yIiksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFk9Yy5Va3x8WTsoZnVuY3Rpb24oYyl7Yy5Xaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/CiExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWChiKSxiLm5hP3RoaXMuYmYoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEgsTGI9Yy5Xa3x8TGIsTWI9bmV3IExiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jaj10aGlzLmFbMTBdO3RoaXMuWmk9dGhpcy5hWzRdOwp0aGlzLmJxPXRoaXMuYVs2XTt0aGlzLmdsPXRoaXMuYVszXTt0aGlzLllxPXRoaXMuYVs4XTt0aGlzLm5qPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3M9YjtiLnByb3RvdHlwZT17SGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLklqOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5aaTp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnE6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmdsOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ZcTp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLktzfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuSGooNCk7KGZ1bmN0aW9uKGMpe2MuYWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSxhJiZjPyh0aGlzLlcoYyksdGhpcy5aKGEpKTp0aGlzLmNhKCkpOnRoaXMuY2EoKTp0aGlzLmNhKCk6dGhpcy5jYSgpfSxmdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LEN4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuYWt8fE9iOyhmdW5jdGlvbihjKXtjLiRqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpezEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IiwKZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMub2EoKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIFBiPWMuJGp8fFBiOyhmdW5jdGlvbihjKXtjLmJrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7Ynx8KGI9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYiYmYi5HZXRBbGxQbGF5ZXJzJiYoYj1iLkdldEFsbFBsYXllcnMoKSkmJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm5hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5ia3x8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5SbT10aGlzLmFbNF07dGhpcy55dT10aGlzLmFbNF07dGhpcy50cz10aGlzLmFbMl07dGhpcy55aj10aGlzLmFbM107dGhpcy5Fcz10aGlzLmFbOF07dGhpcy5IcD10aGlzLmFbM107dGhpcy5qcj10aGlzLmFbNl07dGhpcy54bz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsyXX1jLnRtPWI7Yi5wcm90b3R5cGU9e1FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5SbTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXU6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRzOnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55ajp0aGlzLkRzKGEpfSxEczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRXM6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhwOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuanI6dGhpcy53byhhKX0sd286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy50bXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuUW0oNCk7KGZ1bmN0aW9uKGMpe2MuZm49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuVyhhKX1lbHNlIHRoaXMuY2EoKX0sCkxkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxPdDpmdW5jdGlvbigpe3RoaXMuUmQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuUmQ9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX19LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLmZufHxUYjsoZnVuY3Rpb24oYyl7Yy5lbj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxTdDpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksCmIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSl9LGFkOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpOwphLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sTmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0wO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuYWQod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk5mLmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuU3Qod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5OZigpO3RoaXMuUnQoKX0sUnQ6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLAp0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oKXt9KX0sbTpmdW5jdGlvbihiKXt0aGlzLk10P3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbigpe3RoaXMuTXQ9ITB9fSl9KShjKTt2YXIgVWI9Yy5lbnx8VWI7KGZ1bmN0aW9uKGMpe2MuZ249dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5PdCgpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7CnZhciBWYj1jLmdufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLkFwPXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzZdfWMud209YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5tOnRoaXMuenAoYSl9LHpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5BcDp0aGlzLnFqKGEpfSxxajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLndtfHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy5NbSg0KTsKKGZ1bmN0aW9uKGMpe2MuSW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy53aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLkNzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxmdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLAphPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMud2gmJih0aGlzLndoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy5JbXx8TzsoZnVuY3Rpb24oYyl7Yy5IbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnJ1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKaGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLkhtfHxQOyhmdW5jdGlvbihjKXtjLkptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuYmYoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLkptfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9CnRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuY2s9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkd0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5ja3x8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnQoNCk7KGZ1bmN0aW9uKGMpe2MuTms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Naz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuYmgoKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnFiKCksITA7dGhpcy5UZysrO2lmKDEwPAp0aGlzLlRnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmguYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PQp0eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPwoodGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLk1rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Paz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsCnRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLk9rfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHY9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbN119Yy5rbD1iO2IucHJvdG90eXBlPXtrdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLmtsfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMua3YoNCk7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaGcoKX0sCmhnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5Xanx8ZWM7KGZ1bmN0aW9uKGMpe2MuWWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz0KbmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmx0PXRoaXMuYVs0XTt0aGlzLk1wPXRoaXMuYVsyXTt0aGlzLldzPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzVdfWMuVG09YjtiLnByb3RvdHlwZT17a3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmx0OnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NcDp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLldzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuVG18fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmt0KDQpOyhmdW5jdGlvbihjKXtjLnBpPQpwLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5waXx8aWM7KGZ1bmN0aW9uKGMpe2Mub2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMub2l8fGpjOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj0KbmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMucml8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56bD10aGlzLmFbN107dGhpcy56aT10aGlzLmFbOV07dGhpcy5ubj10aGlzLmFbMTBdO3RoaXMuQXU9dGhpcy5hWzFdO3RoaXMuWHA9dGhpcy5hWzFdO3RoaXMucW49CnRoaXMuYVsyXTt0aGlzLlFpPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbNV07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5XaT1iO2IucHJvdG90eXBlPXt5bDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpsOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56aTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubm46dGhpcy56dShhKX0senU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF1OnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5YcDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucW46dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFpOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Zczp0aGlzLnFrKGEpfSxxazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucms6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5XaXx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMueWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZWg9dGhpcy5naD10aGlzLmZoPSExO3RoaXMueGQ9W107dGhpcy5hZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYj8KbnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBFYj9udWxsOkViLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgemI/bnVsbDp6YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBsYz8KbnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuVGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5PcShhKTpbXSxiO3RoaXMuZ2g9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZmg9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuSGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmFmKXtpZih0aGlzLmVoKWJyZWFrO2I9dGhpcy5hZltjXTt0aGlzLnZmKGIpJiYodGhpcy54ZC5wdXNoKGIpLHRoaXMuSGgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxPcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSwKUHU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmZoKWZvcih0aGlzLmVoPSEwLGE9MDthPHRoaXMueGQubGVuZ3RoO2ErKyl0aGlzLnhkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGRbYV0uTGIpfX19KShjKTt2YXIgbmM9Yy5UbHx8bmMsTT1uZXcgbmM7TS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWW89dGhpcy5hWzldO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMucnc9dGhpcy5hWzFdO3RoaXMudm89dGhpcy5hWzEwXTt0aGlzLk12PXRoaXMuYVszXTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLlNvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzldfWMuS209YjtiLnByb3RvdHlwZT17WG86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLllvOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Obzp0aGlzLnF3KGEpfSwKcXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJ3OnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52bzp0aGlzLkx2KGEpfSxMdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk12OnRoaXMudXMoYSl9LHVzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52czp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYz1jLkttfHxvYyxhZD1uZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5Ybyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOgoiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQmMoay5FdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuQmMoay5JcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLApyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLllnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWWcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtJLmthKCk7dmFyIGNkPWJkKGZ1bmN0aW9uKCl7ZS55Zyh3aW5kb3csSS5FcigpLHtpZDpjZH0pfSw1MDApLGlhPWUuYWEoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenY9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMl19Yy5ibD1iO2IucHJvdG90eXBlPXt5djpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPWMuYmx8fHBjLGRkPW5ldyBwYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWRkLnl2KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy54aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMuc2Q9MDt0aGlzLmJiPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0saXU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxodTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oYSxiKXtlLmZhKCJ3ZWx0LmRlIikmJmUuYWIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5IcigpKXRoaXMubGIubCh0aGlzLmxiLm9kLHRoaXMubGIud2EsdGhpcy5sYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLkFjKTsKZWxzZSBpZih0aGlzLmFyKCkpdGhpcy5jdShmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudihrLnljLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3ICRhKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5SdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLm9iKCJuZXdIb21hZERpc3BsYXkiKTtSPWw9bmV3IFJhKGwsdGhpcy5sYixnKTtsLmd1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5tcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sCmcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuS2UoYSxjLGYpO3RoaXMucGxheWVyLkpoKGwpfX0sSHI6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxiPTA7aWYodGhpcy5zZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLnNkLmdldFRpbWUoKSx0aGlzLnNkPWEsM0U1PGI/ITA6ITE7dGhpcy5zZD1hO3JldHVybiExfSxFdTpmdW5jdGlvbigpe2Uub2IoInByZXJvbGwiKTtlLmZmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0sRHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7CmUub2IoInBvc3Ryb2xsIik7dGhpcy5udSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy51ZyhjKSk/dGhpcy5NYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxWdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnR1KHRoaXMuRHUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTsKaWYoIXRoaXMubWgpe3RoaXMubWg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuTWMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZGQsdGhpcy5wbGF5ZXIucygpKSl9fSxVdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLm11KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuRXUoKTt0aGlzLnBsYXllci5OZSYmdGhpcy5VdCgpO3RoaXMuVnQoKX0sV3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9CjA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMueWQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLkR3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy56ZD10aGlzLnlkLmxlbmd0aH0sYXI6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPHRoaXMuemQmJihhPSEwKTtyZXR1cm4gYX0sY3U6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLnh0LmJpbmQodGhpcykpfSx4dDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0sbXM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTsKcmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnNpfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFwPXRoaXMuYVsxXTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLlVzPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMuVGk9YjtiLnByb3RvdHlwZT17UHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFwOnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlRpfHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9ZWQuUHAoNCl9KS5jYWxsKGthZWNoYWVNQW9sYWVidVosa2FlY2hhZU1Bb2xhZWJ1Wik7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.127 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-127.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:43 GMT
Via
1.1 42b60ee17f7593fff72ca1cb725d6c9a.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA2-C1
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:47 GMT
Server
AmazonS3
ETag
"063da71572f57793ea4125f50b418f84"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
LPVzceiz0_HDYC22-5Pf44LfMustqV7Bmy1wy-VwEE-soFKR7rcD8A==
Expires
0
player.css
vidstat.taboola.com/vpaid/vPlayer/player/v10.4.9/assets/
14 KB
3 KB
Stylesheet
General
Full URL
https://vidstat.taboola.com/vpaid/vPlayer/player/v10.4.9/assets/player.css
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/vPlayer/player/v10.4.9/OvaMediaPlayer.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
25d238eac82235b53958982f2d7c8db542d0c4b05ed49ccc8cfd9d1d56f38760

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:43 GMT
via
1.1 660f4277d8fbef27985e8a4a97e362cc.cloudfront.net (CloudFront), 1.1 varnish
age
332940
x-amz-meta-mtime
1570080948
x-cache
Miss from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
2454
x-served-by
cache-hhn4030-HHN
last-modified
Thu, 03 Oct 2019 05:35:49 GMT
server
AmazonS3
x-timer
S1570413943.348768,VS0,VE0
etag
"06641339ce27ddb2d0da0bf718d4974a"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
content-type
text/css
x-amz-cf-id
t8UhZp89mxtM-fOZp8Z6PgQOY60WzDEww2jDhgUBAYrP7dwNwlAPgw==
x-cache-hits
361590
dsm.js
vidstat.taboola.com/vpaid/ds/176/
1 KB
739 B
Script
General
Full URL
https://vidstat.taboola.com/vpaid/ds/176/dsm.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/vPlayer/player/v10.4.9/OvaMediaPlayer.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
91ffef0e08af098862c5ee0b413103869650c929e0a65fbd29e5815e3b402609

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:43 GMT
via
1.1 15d3b4db3728feaae1780610a1bac86e.cloudfront.net (CloudFront), 1.1 varnish
age
2460633
x-cache
Miss from cloudfront, HIT
status
200
content-encoding
gzip
content-length
499
x-served-by
cache-hhn4030-HHN
last-modified
Mon, 29 Jul 2019 13:39:31 GMT
server
AmazonS3
x-timer
S1570413943.350338,VS0,VE0
etag
"d2ab13c0468acb5251b93e254b36f876"
vary
Accept-Encoding
content-type
application/octet-stream
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
x-amz-cf-id
0nv2OT_XPk-IG7z9z6oZo9TBdh3JN4CIlKPHiCNZtGPiLDGtmmFw1Q==
x-cache-hits
2111243
st
convammp.taboola.com/
0
53 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=81&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7h_4CFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNhusNqvdcrgagkawCJPlgsWbUEbD1Wo1XM0Wg8lyslrOphBiLJfJoBZIWGa_76CgnJ4es8sgY7lMBrVA1jS5_G74QtPp8Lnu9brf765z-hx2kcuve1kchsPnL3g4Dw-zX_Q0HD5_wcN5eJjdYr_PaXdr_m6dy2j6vFV3k1vzd4v9Ls_prTRa3mK_z2l3Cy5_i9nldvnlAAAAAPAAoFTYD_EDCAAQAQAAACABAAAAQBFQ8W8hcAEAAACAAVCA9aMBAMXBcK679WU3Olyfl90fAAAPASAAAAMKJAADOE0lABU5BycAAAAAAAAAACz_____MQB6xGcyABlKgz0ADz4AD0QFiUWMAAAAACCZ2jyOJnVCZVEFAECQbgVwBQAQ0DZ6f-EQBgAAQDC2QA-L32922DV-t8sAAAAAAAAAAMz-z_7RhIjG3NKCWAp41X4BAQDWfgEBANjUDQDgLQAu6AhaMRisziAmm9FuMjsAAACAu____389EFkOZybbarbZbJbD1WKz8lgmrpnHNht5HBPncLa90NgP2XAVmJi-EWGZ_b6DgnJ6eswug4zlMhnUAlnT5PIbxAcNw3IyCOY3YYvRajLZLIez5WIyGI6Go9H-BG40wAkaDgeL3WCxWyyGk8VkNFgOFigQgwlOyHC0maxGu9VushxORqPZZrJBilatZqPNYLiaTWa73Wo4GC5HI6RozWI2mSxmo-VuM1hORoPhZDhEmLE4B5PJxLSW-VbLtWgzWrmVI9tsrXJuFpvhwjlyLTxr0etjOi1Hk8nMtkXBAKW9CC7SieZ0-btclrfmbXHrnD6HRSzRnCzSieyyryyHM5NtNdtsNsvharFZeSwT18xjm408jolzONt3LM7BZDIxrWW-1XIt2oxWbuXINlurnJvFZrhwjlwLz1r0-phOy9FkMrPtG6vdYLTYLEeTfWO1G4wWm-Vosu_QGb6rz9movGkVHqHx-Uz5DTOnQeEyWLw_iWkx7c4Ont_v6FSpLhpjQ_ZNKMwGj8GgiCWC00U6Eb2Mp4tYInlapBPlZDFYuJar5W642Kw2q8liM9oMRx6HyWIZTQybiViiNF2kE73uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfbZVH_sSFGo7luNlcMlnPNYJUAAAAAAAAAAJYwZ94EAAAA4DSQxWIwWSwXAEKMdZfgUyrk0Qn8rbjxY4g5Xf4ul-WteVvcOqfPYWUAiZ0C!&cmcv=&uv=231412&unm=FEED_MANAGER&cb=1570413943339&abt=expl_vA!flrr3_vB!sbl_vB!ufm_vE&baseReportD=taboola.com&dataCenter=am&
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:43 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1570413943.358564,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19150-FRA
match
pixel.consentric.de/tp/
43 B
354 B
Image
General
Full URL
https://pixel.consentric.de/tp/match?trackingId=3363664383570564462&partnerId=1200
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
62.138.221.190 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
aa03dc59bdca72631d2301e4297cfa030bd31b907dc138e7b973d12311c90a22
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:43 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Content-Type
image/gif
Access-Control-Allow-Origin
*
Cache-Control
private, no-cache, no-cache=Set-Cookie, proxy-revalidate
Content-Length
43
X-XSS-Protection
1; mode=block
/
ssl.1.damoh.giga.de/17c9cb9fffc7e2e5cb819507fb18153ad70600ff/ Frame 92E8
653 B
1 KB
XHR
General
Full URL
https://ssl.1.damoh.giga.de/17c9cb9fffc7e2e5cb819507fb18153ad70600ff/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGthZWNoYWVNQW9sYWVidVo9a2FlY2hhZU1Bb2xhZWJ1Wnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5pdShtKTthLmh1KGwpO2EuV3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5xdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzldfWMuRnU9YjtiLnByb3RvdHlwZT17Rm46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkduOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LcDp0aGlzLkRtKGEpfSxEbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRW06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYT1jLkZ1fHxoYSxzYz1uZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRm4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuTmM9W107dGhpcy5uZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnd0LmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5SZz17fTt0aGlzLmRmPSExfWMuaGs9YjtiLnByb3RvdHlwZT17UXU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrdGhpcy5uYltiXSsiXyIpO3JldHVybiBhfSxZYjpmdW5jdGlvbigpe3RoaXMuZGZ8fCh0aGlzLmRmPWUuYWEoMTApKTtyZXR1cm4gdGhpcy5kZn0sb2I6ZnVuY3Rpb24oYSl7dGhpcy5uYlthXXx8KHRoaXMubmJbYV09MCk7dGhpcy5uYlthXSs9MTs1PHRoaXMubmJbYV0mJiF0aGlzLlJnW2FdJiYodGhpcy5SZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIiwKdGhpcy5RdSgpLCEwKSl9LG5lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFVuOmZ1bmN0aW9uKGEpe3RoaXMuYmEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx3dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy52dChhLmRhdGEpfSwKdnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmJhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lciYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxnZTpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxvZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkdnKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5qaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sR2c6ZnVuY3Rpb24oYSl7dmFyIGI9Cm5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFNuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMuemEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS55cShhKSlyZXR1cm47KGI9dGhpcy5vZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09CmF9fSx5cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSx3ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUnI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0seGU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxGZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PQp0eXBlb2YgZD9kOm51bGx9LFBoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTsKdmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTtxPWcuaGVpZ2h0Kmcud2lkdGg7ZD1nLndpZHRoO2Y9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEZlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWUoYS5lbCwKYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihiKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LEhiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSx6ZTpmdW5jdGlvbihhKXt2YXIgYj0KMCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LEtoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixxLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLG09MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2gocSk7c3dpdGNoKG4lCjQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eT1rO3U9bTtyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHEsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSwKdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHEsNSkrKG4meXxuJnV8eSZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChxLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2U9ZStxJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O209bSt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihtKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksCmY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHE+PjYsZz1xJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihxKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sTnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSwKaGQ6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxxPSExLGM9ITEsZT0hMSxnPSExLGs9ITEsbT0hMSxsPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlRiPyEwOiExfWNhdGNoKHUpe310cnl7cT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwKLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPXE7YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LGxyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LAokbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sVGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxmbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEpvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWGkoKXx8YS5oaigpfHxhLmxyKCl8fGEuRmwoKXx8YS4kbSgpfHxhLlRrKCl8fGEuZm0oKX19O3JldHVybiBudWxsIT1hLkpvKCl9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscT1hLmxlbmd0aDtmPHE7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sWmI6ZnVuY3Rpb24oYSl7YT10aGlzLnphKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sUXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy56YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LEJwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LEd1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5jaShiKSsiOiIrdGhpcy5jaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sY2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGZmOmZ1bmN0aW9uKGEpe3RoaXMuQ2I9YX0seWc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5DYjt0aGlzLmNlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7CmEuZGlzcGF0Y2hFdmVudChmKX0sQmM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLnlnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHEsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3EmJihCPWsuVGEoQixxKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuQmMoQil9LHl0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmIuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuUXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxKdTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuWWIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmNlKGEpfSxjZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnl0KGEpO2lmKGIpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bS5KYygpO20ueWEoYSwhMCk7YT1tLnlhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO20uRGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uSmMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwptLnlhKGYsITApO2Y9bS55YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkRhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sS2Q6ZnVuY3Rpb24oYSl7aWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bS5KYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1tLnlhKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO20uRGEoYSl9fSxMZTpmdW5jdGlvbigpe20mJm0uVj9tLmlzRW5hYmxlZCYmbS5jcCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sY2c6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkdlKGEpfHx0aGlzLlJyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guY2YmJndpbmRvdy5zYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMud2coYSkpcmV0dXJuIHRoaXMud2coYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYWIoYSxiLkxhLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnFkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLlNuKGUsYSk7cmV0dXJuIGV9LGFiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIGw9ZXx8bTtlPSEwO2smJihlPSExKTtpZihsJiZsLlYpaWYobC5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtsLnlhKGEsZSk7ZT1sLnlhKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtlLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHIgaW4gZCllLmRhdGFbcl09ZFtyXTtyZXR1cm4gbC5EYShlLGYsYywiIiwiIixnKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYSxiLGQsZixjLGwsZyxrKX0uYmluZCh0aGlzKSw1MDApfSxqaDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fAo0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxrKSxsLndpdGhDcmVkZW50aWFscz1lLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKHIpe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuamgoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuTmMpZm9yKHZhciBjIGluIHRoaXMuTmMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5OY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueGIoYSk7ZCYmCihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sa2g6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihhLGYuTGEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLmZzKGYucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LApxdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5OYz1hfSxEdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOgpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sS286ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LExyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLmhrfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT0KYXx8e319Yy5naz1iO2IuVGE9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLmp0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkhzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuanE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlhmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlBmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLAptZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuVWY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuWWY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLkpuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLlNmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuSnY9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkdzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmtxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IucHc9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iua2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ycD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuZGQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi55Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuV2Y9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkxuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuVWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLiRkPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLmJlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5Lbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iuamk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Kcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnRkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnRmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07CmIubGc9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkZ2PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRXY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Jcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7CnZhciBrPWMuZ2t8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzEwXTt0aGlzLnRvPXRoaXMuYVszXTt0aGlzLldyPXRoaXMuYVs1XTt0aGlzLmJ0PXRoaXMuYVsxMF07dGhpcy5Ebz10aGlzLmFbM107dGhpcy5Qcz10aGlzLmFbMTBdO3RoaXMuSG89dGhpcy5hWzddO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMuR2k9dGhpcy5hWzJdO3RoaXMuS2k9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5ScD1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSW46dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnRvOnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xcjp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnQ6dGhpcy5DbyhhKX0sQ286ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuRG86dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBzOnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ibzp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS3c6dGhpcy5GaShhKX0sRmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5HaTp0aGlzLkppKGEpfSxKaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2k6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLlJwfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Ibig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmlrPWI7Yi5wcm90b3R5cGU9e3plOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09CmEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LExxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LApsZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubGQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxFcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxZZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnplKHRoaXMuTHEoKSsiIiksCmE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaWt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMuT2k9dGhpcy5hWzVdO3RoaXMuRWk9dGhpcy5hWzhdO3RoaXMubnE9dGhpcy5hWzEwXTt0aGlzLmhtPXRoaXMuYVs0XTt0aGlzLkhrPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuR3c9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1sOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53azp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhPwp0aGlzLk9pOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRWk6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ucTp0aGlzLmdtKGEpfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaG06dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5Hd3x8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MubGwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsCmY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLm9qPWJ9KShjKTt2YXIgTD1jLm9qfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNuPXRoaXMuYVs3XTsKdGhpcy5Vbz10aGlzLmFbMl07dGhpcy5DdT10aGlzLmFbOF07dGhpcy54cz10aGlzLmFbNF07dGhpcy5Fbj10aGlzLmFbNl07dGhpcy5Gbz10aGlzLmFbMl07dGhpcy5Kaz10aGlzLmFbN107dGhpcy5hbD10aGlzLmFbNF07dGhpcy5PcD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs5XX1jLnJvPWI7Yi5wcm90b3R5cGU9e0JuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVW86dGhpcy5CdShhKX0sQnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN1OnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54czp0aGlzLkRuKGEpfSxEbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRW46dGhpcy5FbyhhKX0sRW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkZvOnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLiRrKGEpfSwKJGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFsOnRoaXMuTnAoYSl9LE5wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5PcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucm98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLkJuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuU2w9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5NYT17fTt0aGlzLkk9bnVsbDt0aGlzLktjPTEwMDt0aGlzLkliPTA7dGhpcy5XYT0xNTA7dGhpcy5MYj0wO3RoaXMuanUoYil9LGc6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhPyh0aGlzLkliKyssdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLktjKSk6CjA+dGhpcy5XYSYmKHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5LYykpfSxhdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkliPnRoaXMuV2E/ITA6ITF9LGJmOmZ1bmN0aW9uKCl7dGhpcy5JYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sanU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LEpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuUCgpLCEwKTt0aGlzLk1hW2IubGEoKV09YjtNJiZNLmdoJiZNLlB1KGIpfSxyeDpmdW5jdGlvbigpe3JldHVybiBlLnhlKHRoaXMuTWEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX0sTXI6ZnVuY3Rpb24oYil7Yj1iLkthKCk7Zm9yKHZhciBhIGluIHRoaXMuTWEpaWYoYi5pZD09CnRoaXMuTWFbYV0uS2EoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sSng6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5TbHx8dDsoZnVuY3Rpb24oYyl7Yy5VbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLktjPTEwO3RoaXMuSWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubmE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkJiPSIiO3RoaXMucWc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5LYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxNOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30sCnR1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSxzeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LG11OmZ1bmN0aW9uKGIpe3RoaXMuT2U9Yn0scXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZX0sTmU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhJiYodGhpcy5JYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuS2MpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpOwplbHNlIHJldHVybiExfWNhdGNoKGIpe319LEVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2EoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuYnIoKXx8dGhpcy5ObigpO3RoaXMuQmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSx0eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxObjpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5hYSgxMCkpfSxicjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sVzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj0KYn0sS2E6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmF9LGNhOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMH0sTGM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxJZTpmdW5jdGlvbigpe3JldHVybiExfSxKaDpmdW5jdGlvbihiKXt0aGlzLkJiPWJ9LHB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmJ9LEVoOmZ1bmN0aW9uKCl7dGhpcy5CYj1udWxsfSx2eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuQmImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLnFnfHwodGhpcy5xZz0hMCl9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLlVsfHxwOyhmdW5jdGlvbihjKXtjLnRpPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5JPXRoaXMucGxheWVyPSIiO3RoaXMuTGY9IjEiO3RoaXMuTWY9IjIiO3RoaXMuem49IjMiO3RoaXMuUWM9MDt0aGlzLm5oPQozMDt0aGlzLlJiPVtdO3RoaXMuZ2I9W107dGhpcy5vYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5aZj10aGlzLmZpPSExO3RoaXMuc3RhdHVzPXRoaXMuUWM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLmdmKGIpO3RoaXMua3UoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5maXx8KHRoaXMuZmk9ITAsZS5MZSgpKX0sU2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxEcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5rYSgpXXx8KHdpbmRvd1thLmthKCldPXt9KTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldfHwod2luZG93W2Eua2EoKV1bYi5sYSgpXT17fSx3aW5kb3dbYS5rYSgpXVtiLmxhKCldLmluaXRpYXRvcj0KZS5ZYigpKTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWWIoKV0/d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldKys6d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldPTF9LEpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLmhmKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMueGEoKSl7dGhpcy5EcigpO2lmKCF0aGlzLkpyKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmhmKCk7cmV0dXJufXRoaXMuaGYoKTt0aGlzLkkodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLlpoKCk7dGhpcy5aZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSx1OmZ1bmN0aW9uKGIsCmEpe3RoaXMueGEoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmdiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxaaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuZ2Ipe2Zvcih2YXIgaD0wO2g8dGhpcy5nYi5sZW5ndGg7aCsrKXRoaXMub2NbdGhpcy5nYltoXS5yZWFzb25dPT10aGlzLm9jW2JdJiZhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLHRoaXMub2NbdGhpcy5nYltoXS5yZWFzb25dPHRoaXMub2NbYl0mJihhPVtdLGEucHVzaCh0aGlzLmdiW2hdLmRldGFpbCksYj10aGlzLmdiW2hdLnJlYXNvbik7dGhpcy5vY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITAsYSl9fSx1eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlpmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZn0saGY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxydTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuem59LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5RY30sUmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTGZ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk1mfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5RY30sZ2Y6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxrdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxqczpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMudGl8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR0PXRoaXMuYVsyXTt0aGlzLiRzPXRoaXMuYVsxMF07dGhpcy55dz10aGlzLmFbN107dGhpcy5pbD10aGlzLmFbNl07dGhpcy5Naj10aGlzLmFbN107dGhpcy5Maz10aGlzLmFbMV07dGhpcy5mbz10aGlzLmFbNV07dGhpcy5ncT10aGlzLmFbOV07dGhpcy5tcD10aGlzLmFbOV07dGhpcy5udD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs5XX1jLm1rPWI7Yi5wcm90b3R5cGU9e2N0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kdDp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy54dyhhKX0seHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnl3OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pbDp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5LayhhKX0sS2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5Mazp0aGlzLmVvKGEpfSxlbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZm86dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdxOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5tcDp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLm1rfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5jdCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87CnRoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Uanx8b2E7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLmR4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7CmIuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuVWp8fHBhOyhmdW5jdGlvbihjKXtjLlZqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Wanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmJuPXRoaXMuYVsxXTt0aGlzLm5yPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuQXQ9YjtiLnByb3RvdHlwZT17dW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZtOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLmJuOnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubnI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkF0fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy51bSg0KTsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5xcD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5iYz0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5XKGIpfSwKeGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KSwKYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJgozMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyOwphLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Da3x8c2E7KGZ1bmN0aW9uKGMpe2MuQms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYKKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ29tcGxldGUiKTsKdGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnFwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTt0aGlzLlNlKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMudygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJnRoaXMuVGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy53KCksdGhpcy5yYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sanM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8odGhpcy5yZT50aGlzLnNlJiYoYj0hMSksdGhpcy5HKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSw1MCk6KGEudmcoKSxhLnhnKCksYS5iY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ca3x8dGE7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5HcSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLk1yKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sb3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sR3E6ZnVuY3Rpb24oKXt2YXIgYj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB1YT1jLkRrfHx1YSx2YT1uZXcgdWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFqPXRoaXMuYVsxXTt0aGlzLlR2PXRoaXMuYVs0XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5sbT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLmpsPWI7Yi5wcm90b3R5cGU9e1BqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Rajp0aGlzLlN2KGEpfSxTdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHY6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJzOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMuamx8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlBqKDQpOwooZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0KITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHhhPWMuVm18fHhhOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLkNhPXRoaXMuWGM9ITE7dGhpcy5BaD1lLkhiKDEwKTt0aGlzLmVpPSEwO3RoaXMudGM9dGhpcy5WZz0hMTt0aGlzLkZzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5xaCgpLHRoaXMuWm8oKSx0aGlzLnFiKCkpfSxGczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmNvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLAoiOyIsYi5KP2IuSi5xYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaGU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5oZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkFoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJgoodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxYYjpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSWc6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSwKS3I6ZnVuY3Rpb24oKXtpZighdGhpcy5VZyl7dmFyIGI9dGhpcy55YigpLGE9dGhpcy5JcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVWc9ITApfXJldHVybiB0aGlzLlVnfSxJcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuWGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlhjPSEwKTtyZXR1cm4gdGhpcy5YY30scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLlR0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sVHQ6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuSWcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudWM9ITA7aWYoZS5mYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLnVjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxueDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMubmcmJmIuYWRzJiYodGhpcy5uZz1iLmFkcyk7cmV0dXJuIHRoaXMubmd9LFpvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdhKCEwKTt0aGlzLnUoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5TZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPQohMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLklnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0scWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuS3IoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpOwp0aGlzLnliKCl9ZWxzZSB0aGlzLlZnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpLGI9dGhpcy5YYigpO2EmJiFiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZ2EoKSk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlZnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPQphLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LCRvOmZ1bmN0aW9uKCl7dGhpcy56Y3x8KHRoaXMuemM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnpjIT0KYi5hZHMuc3RhdGUmJih0aGlzLnpjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuemM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRvKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpezA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5laT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5HKHRoaXMuZWksZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGhwOmZ1bmN0aW9uKCl7dGhpcy53eHx8KDEwPHRoaXMuVXY/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5VdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLiR0KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhwKCl9LmJpbmQodGhpcyksNTApKSl9LCR0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlZ2KXt0aGlzLlZ2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciB5YT1jLlVtfHx5YTsoZnVuY3Rpb24oYyl7Yy5XbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5RaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUWgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS54ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwKKG5ldyB5YShhLHRoaXMuSSkpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxUOmZ1bmN0aW9uKCl7dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLktjKX19KX0pKGMpO3ZhciB6YT1jLldtfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGw9dGhpcy5hWzEwXTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm5rPWI7Yi5wcm90b3R5cGU9e0dsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5IbDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLm5rfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuR2woNCk7KGZ1bmN0aW9uKGMpe2MuSmw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5VZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7CmQmJmEmJmEuYWMmJigwPD1oLmluZGV4T2YoZCl8fGEud2QoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlVlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlVlKys7aWYoMTA8dGhpcy5VZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuSmx8fENhOyhmdW5jdGlvbihjKXtjLklsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8Cih0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudGU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5xcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLnFxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucXQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuSWx8fERhOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLktsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXc9dGhpcy5hWzVdO3RoaXMuanY9dGhpcy5hWzNdO3RoaXMuc249dGhpcy5hWzFdO3RoaXMuenM9dGhpcy5hWzddO3RoaXMubW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy5BaT1iO2IucHJvdG90eXBlPXtIdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXc6dGhpcy5pdihhKX0saXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmp2OnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zbjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenM6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9CmMuQWl8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLkh3KDQpOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkZnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMudXQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy51dCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxncDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCkllOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy50a3x8SGE7KGZ1bmN0aW9uKGMpe2Muc2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMuc2t8fElhOyhmdW5jdGlvbihjKXtjLnVrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLnVrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRms9dGhpcy5hWzhdO3RoaXMudHQ9dGhpcy5hWzhdO3RoaXMuT2o9dGhpcy5hWzNdO3RoaXMuUWw9dGhpcy5hWzVdO3RoaXMuR3I9dGhpcy5hWzJdO3RoaXMubHM9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5Saj1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRms6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnR0OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Pajp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWw6dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdyOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMubHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYT1jLlJqfHxMYSxEYz1uZXcgTGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuams9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sbHU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxQbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmprfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmgsZCxmKXt0aGlzLmZiPWE7dGhpcy5BZz10aGlzLm5pPSExO3RoaXMucmg9ZDt0aGlzLlJoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLmZiPW5ldyB6KGEpKTt2YXIgYz10aGlzLnNiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkhlKHRoaXMuZmIudXJsKSYmbS5NZCl7dmFyIGU9bmV3IHooYS51cmwpO2UubHUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uaWEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5raz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5mYi5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5BZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuUmg/dGhpcy5zYi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCExKTp0aGlzLnNiLm9wZW4odGhpcy5mYi5tZXRob2QsdGhpcy5mYi51cmwsITApLHRoaXMubml8fCh0aGlzLnNiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5zYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuc2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuc2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkhlKHRoaXMuZmIudXJsKT9tLk1kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSGUodGhpcy5mYi51cmwpLHRoaXMucmgmJnRoaXMucmgoKX1yZXR1cm4gdGhpcy5zYn19fSkoYyk7dmFyIE1hPWMua2t8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLlZkPSExfWMucGo9YjtiLnByb3RvdHlwZT17cHU6ZnVuY3Rpb24oYSl7dGhpcy5WZD1hfSxvdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LFl0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e053OiJBZENsaWNrVGhydSIsUHc6IkFkRXJyb3IiLFF3OiJBZFN0b3BwZWQiLFR3OiJBZExpbmVhckNoYW5nZSIsVXc6IkFkVGFnUGFyc2VkIixYdzoiQWRWaWRlb0NvbXBsZXRlIiwkdzoiQWRMb2FkZWQiLGF4OiJBZFNraXBwZWQiLGJ4OiJBZFN0YXJ0ZWQiLFJ3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsU3c6IkFkSW1wcmVzc2lvbiIsT3c6IkFkQ3JlYXRpdmVWaWV3IixWdzoiQWRWaWRlb01pZHBvaW50IixXdzoiQWRQYXVzZWQiLFl3OiJBZFZpZGVvU3RhcnQiLFp3OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuVmQsYltkXSl9LFh0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVWQpZm9yKHZhciBiIGluIHRoaXMuSGEuVWQpdGhpcy5IYS5VZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVWRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuVmQmJnRoaXMuWXQoKTt0aGlzLkhhJiZ0aGlzLlh0KCl9fX0pKGMpO3ZhciBOYT1jLnBqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmllPQp0aGlzLnZjPXRoaXMud2I9bnVsbDt0aGlzLkNwPXRoaXMuSmI9dGhpcy5paD0hMTt0aGlzLkxhPSIiO3RoaXMuZGg9ITE7dGhpcy53YT10aGlzLm9kPSIiO3RoaXMuWmc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuJGU9ITE7dGhpcy5wYT1bXTt0aGlzLk9nPXRoaXMuZmM9IiI7dGhpcy5xZT0hMTt0aGlzLnFmPTA7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuSWQ9W107dGhpcy5nYz0iIjt0aGlzLnJmPTA7dGhpcy52aWRlb3BsYXphPQp7fTt0aGlzLkRjPSExO3RoaXMuaXA9dGhpcy5PZD1udWxsO3RoaXMuTGg9dGhpcy5sYz10aGlzLnNnPXRoaXMudWY9dGhpcy5NZD10aGlzLmtlPXRoaXMuUmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5wZD0wO3RoaXMuUWc9ITE7dGhpcy5QZz0xRTM7dGhpcy5aYz0hMTt0aGlzLlFhPTFFMzt0aGlzLk9mPSIifWMubGs9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy53YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLnZjLGFkdGFncmVnZXg6dGhpcy5pZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5paCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5DcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmRoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLndhLAppc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuWmcsc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZmMsaG9tYWRBZHBhdGg6dGhpcy5PZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnFmLEhPTUFEX1ZFUklGSUVEOnRoaXMuR2YsSE9NQURfQkxPQ0tFRDp0aGlzLkVmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm5jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5GZix0ZXN0SGlkZTp0aGlzLmhjLHRlc3RUYWdzOnRoaXMuaWMsdGVzdFRhZ3NKUzp0aGlzLmpjLHRlc3RUYWdzWEhSOnRoaXMuSWQsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMucmYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmlwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUmMsCmJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5rZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5NZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy51Zixjb25maWdGYWlsdXJlczp0aGlzLmhiLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLkloLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5qYix2cGFpZDp0aGlzLmxjLHNraXBBbGxvd2VkOnRoaXMuTGgsdm1hcHM6dGhpcy5raSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuWmMsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sJHE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmKGE9ITApO3JldHVybiBhfSxlZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSxIcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2JdJiYxPT10aGlzLmhiW2JdJiZhLnB1c2goYik7CnJldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLktvKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuR2UoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuRmMoKT9lPWE6ZT1jLnByb3RvY29sKwoiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLkpjKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMud2N8fHRoaXMud2J8fHRoaXMudmN8fHRoaXMuaWUpJiYoZz10aGlzLnJzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuSXEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxHZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT8KYj0hMDp0aGlzLkZjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxGYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5HZShhKTtyZXR1cm4gYn0sSXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PQp0eXBlb2YgdGhpcy5MYSYmMDx0aGlzLkxhLmxlbmd0aClyZXR1cm4gdGhpcy5MYTtmb3IoZCBpbiB0aGlzLkxhKWlmKGI9dGhpcy5MYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLml4O3JldHVybiJub25lIn0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLkloXX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnFkKCksYj10aGlzLktoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LG9oOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LHFzOmZ1bmN0aW9uKGEsCmIpe3ZhciBkPWUuemEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLm9oKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5vaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LHJzOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJgooYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy52YyYmKGE9dGhpcy5xcyhhLHRoaXMudmMpKTtyZXR1cm4gYX0sZnA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuYXAodGhpcy5GYS5jbGllbnRBUElzKX0sYXA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLnB1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5vdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5kaD0hMDt0aGlzLm9kPWE7dGhpcy53YT1iO3RoaXMuJGU9ZDt0aGlzLk9kPWY7dGhpcy5BYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5mcCgpO3RoaXMuZXMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5jcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLndhKXRyeXt0aGlzLndhPWIsdGhpcy54YygpfWNhdGNoKGspe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9fSxwYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sZXM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMub2QrdGhpcy5mZSgiZ2xvYmFsIikpLHRoaXMuV3EuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sY3M6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5mZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sZmU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2Upe3RoaXMua2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQWM9ITEpO3RoaXMuQWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5BYz90aGlzLkFjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5aZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuRWYpKTt0aGlzLk5iKCk7ZS5CYyhrLmp0KTsoYj1lLlpiKHRoaXMucWQoKSkpfHwoYj1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxXcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZmN8fHRoaXMuTGF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8Cm51bGw7dGhpcy5PZz1hLmFkcGF0aHx8IiI7dGhpcy5xZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkloPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZmMmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuR2MoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEdjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuSmMoKSksZD10aGlzLnphKHRoaXMuZmMpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPQoiUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuZmMrdGhpcy5mZSgiY3VzdG9tZXIiKSk7dGhpcy5EYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImN1c3RvbWVyIik7YT90aGlzLmVtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZW09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxTdTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkRjPSEwO3RoaXMuR2MoITApO3JldHVybn19dGhpcy5NZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuc2c9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmpiPQp0aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaGM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5qYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy53Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnZjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5pZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5paD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmxjPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5sYzt0aGlzLkxoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuJGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmtpPWIudm1hcHN8fCIiO3RoaXMuWmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8CjFFMzt0aGlzLk9mPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmdjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuUHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnFlJiYodGhpcy5nYz1udWxsKTt0aGlzLnJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkRjPSEwLHRoaXMuR2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMubXYoKSYmKHRoaXMuaGN8fHRoaXMuamN8fHRoaXMuaWN8fHRoaXMuZ2N8fHRoaXMuSWQpP3RoaXMuJGU/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSksdGhpcy5tZSgpLHRoaXMuTmIoKSk6dGhpcy5ZdSgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlp1KCkpfX0sWXU6ZnVuY3Rpb24oKXt0aGlzLlh1KCk7CnRoaXMuJHUoKX0sJHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsCiIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9CmQpe3ZhciBjPWUuaGQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxadTpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpO3RoaXMuTmIoKX0sT2M6ZnVuY3Rpb24oYSl7dGhpcy5SYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIoYSkpLHRoaXMuTmIoKSx0aGlzLm1lKCkpfSxYdTpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmhoKCkpdGhpcy5PYyh0aGlzLm5jLAoibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5WaCgpfX1lbHNlIHRoaXMuVmgoKX0sVWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLkhiKCkpO3RoaXMuY3YoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm5mLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuaWM9dGhpcy5JZCkmJnRoaXMuaWMubGVuZ3RoKXt2YXIgZD10aGlzLmljLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubmYoKX0sY3Y6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGMsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5VaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5qYyYmdGhpcy5qYy5sZW5ndGgpe3ZhciBkPXRoaXMuamMuc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5VaCgpfSxkdjpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nYz8odGhpcy5xZisrLHRoaXMuRGEobmV3IHoodGhpcy5nYyksdGhpcy5XdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5vZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlNoKCl9LG9mOmZ1bmN0aW9uKGEpe3RoaXMuT2ModGhpcy5GZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LFd1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnFmP3RoaXMubmYoKTp0aGlzLm9mKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuU2goKTp0aGlzLm9mKCJBQUEiKX0sU2g6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5tZSgpfSxoaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUmMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaGgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5PZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk9kJiZ0aGlzLk9kKCl9LGVwOmZ1bmN0aW9uKCl7aWYodGhpcy51ZiYmdGhpcy4kcSgpKXt2YXIgYT10aGlzLkhxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxaaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnBkfHwodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlBnJiYhdGhpcy5RZyYmKHRoaXMuUWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlBnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5uaT0hMCk7cSYmZS5OcigpJiYoYS5BZz0hMCk7ZyYmKGEuUmg9ITApO3JldHVybiBhLmxvYWQoKX0sYnA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxWdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMua2l9LGNwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMuSXYuYmluZCh0aGlzKSx0aGlzLkh2LmJpbmQodGhpcykpfSxJdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMubHEoKX0sSHY6ZnVuY3Rpb24oKXt9LApscTpmdW5jdGlvbigpe2UuQmMoay5rcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYWIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxtdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnJmfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmxrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucG09dGhpcy5hWzFdO3RoaXMuQ209dGhpcy5hWzJdO3RoaXMueGw9dGhpcy5hWzRdO3RoaXMuQ3Q9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMl19Yy5aaj1iO2IucHJvdG90eXBlPXtvbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucG06dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNtOnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueGw6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMuWmp8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLm9tKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmJiPWEuZi5QKCk6dGhpcy5iYj0iIjthLmYuWGcmJmEuZi5YZyh7cGF1c2U6dGhpcy53ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkdoLmJpbmQodGhpcyksbXV0ZTp0aGlzLlBlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuQXYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5pYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlZiPXRoaXMuWWM9ITE7dGhpcy5Jbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkZkPXt9O2Uub2IoIm5ld0JpZ0FkSWQiKTt0aGlzLkxvPWUuYWEoMTApO3RoaXMubGY9MDt0aGlzLldjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuV2M9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYKKGE9dGhpcy5iLmYucygpKSx0aGlzLldjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlZuPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuc2g9dGhpcy5FZD0hMTt0aGlzLmxoPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5lZT0hMTt0aGlzLmJpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYWM9ITE7dGhpcy5zcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5NaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5QZD10aGlzLk9iPXRoaXMub2U9dGhpcy5lZD10aGlzLkdkPXRoaXMucmI9dGhpcy5tYz10aGlzLnVoPXRoaXMua2Q9dGhpcy5udj10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5yYz1bXTt0aGlzLmNjPXt9O3RoaXMuZ3Q9MjAwO3RoaXMuQmY9CnRoaXMuQ2Y9dGhpcy5qZT10aGlzLkFmPXRoaXMuWmU9ITE7dGhpcy52ZD17fX1jLmZrPWI7Yi5wcm90b3R5cGU9e2d1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGJ9LCRoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkNiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5MdSgpO2UudihrLkxuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEtlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5sZisrLGUub2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5lcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJgp0aGlzLkwuaXNFbmFibGVkPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmxjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuJGgoKSxuZXcgUyh0aGlzLGEsdGhpcy5saCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5sYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7CmVsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLktlKGEsYixjKX0sNTApfX0sVmU6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5rZD0hMTt0aGlzLmM9YTt0aGlzLnV1KHRoaXMuYyk7dGhpcy52ZD1uZXcgUWEodGhpcy5jLkt2LHRoaXMudmlkZW8se30pO3RoaXMuTGcoYSk7dGhpcy5yYz10aGlzLkNnKGEpO3RoaXMubnAoKX0sTGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuRmQ9dGhpcy5TcShhKSksdGhpcy5MZyhhLnBhcmVudCkpfSxDZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuQ2coYS5wYXJlbnQpKSxjLnB1c2godGhpcy5DcShhKSkpO3JldHVybiBjfSwKQ3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LFNxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8CmYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5rYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZ2QmJmEuZ2QuZXJyb3ImJmEuZ2QuZXJyb3IuY29kZSYmKGI9YS5nZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlBjLmNvZGU6Yj09Ry5XZC5jb2RlP2UudihrLmh3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpOihlLkxlKCksYj09Ry5KZi5jb2RlJiZlLnYoay5Hcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5qcSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuTXUoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmUudihrLkp2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLnYoay5wdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUudihrLnd3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5Icyx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsuRnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsuR3YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuV2IoYSk7dGhpcy5SYSgpfSxXYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLkplKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSx1dTpmdW5jdGlvbihhKXt0aGlzLm9lPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTsKdGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5aZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLkl4PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7CnRoaXMuVm4mJnRoaXMucGxheWVyLnVlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci51ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuUW4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLlplJiZiLmxvYWQoKTtpZih0aGlzLldoKGIpKXt0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt0aGlzLlRuKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5aZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz0KdGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLm9wKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5zdSgpKTp0aGlzLmMub3JpZ2luLnRnKHcuVGQpfSxzdTpmdW5jdGlvbigpe3RoaXMuQWY9ITA7dGhpcy5yYj10aGlzLm1jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnJiPSEwKTtlLm5lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlVuKHRoaXMuYy5vcmlnaW4udmEpOwp0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnZoKCk7dGhpcy5iLmpmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5qZigpO3RoaXMudGE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmdpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuVnEoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuY2coImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmdlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuR2QmJnRoaXMuYi5mLkFhKCkmJmUudihrLnljLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi4kYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5yYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuWHYoKSx0aGlzLmIuJGIoITApLCF0aGlzLk9iKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsCmNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLiRiKCEwKSx0aGlzLmV3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN3KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR3KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZncoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuYncoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubGkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9CmEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlViKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmtnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5aYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuYmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT0KYS5kYXRhLm5hbWUmJih0aGlzLkNmJiYodGhpcy5CZj0hMSx0aGlzLmVjKCkpLHRoaXMuWnYoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnJiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpOwplLmdlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuZ2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuJGYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubWM9ITB9LFp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSk7dGhpcy5tYz0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLk9oKCk7ZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sZXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sY3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5rZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSl9LGR3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxidzpmdW5jdGlvbigpe3RoaXMud2YoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxsaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm5lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSwKV3Y6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmd3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5saSghMCl9LFFuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5GYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5Sdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LApXaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sVG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxBZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5oaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxoaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMueWYoYSl9LmJpbmQodGhpcyksdGhpcy5JbykpfSx5ZjpmdW5jdGlvbihhKXtpZighdGhpcy5ZYyYmdGhpcy5XaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLlZiKXt0aGlzLlljPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5BZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnNnfHwKdGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuT3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5qZigpO3RoaXMuTnYoKTt0aGlzLmdpKCk7dGhpcy5kZygpO3RoaXMuYi52aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5tZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLmVkfHx0aGlzLlFmKCl9LFFmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZWR8fChhP3RoaXMuUmEoKToodGhpcy5QZSghMCksdGhpcy5RZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0uYmluZCh0aGlzKTt0aGlzLndlKCkuSmgodGhpcyl9LHdmOmZ1bmN0aW9uKCl7dGhpcy5MLmpiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkpuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxNbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkdnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuSnUoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlFkJiZ0aGlzLk1uKHRoaXMuYy5RZCk7CmlmKCF0aGlzLm9lKWlmKHRoaXMub2U9ITAsdGhpcy5QZHx8KGUudihrLkpzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucGMpe2Uub2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMubGYrKzt0aGlzLlZiPXRoaXMuWWM9ITE7dHJ5e3RoaXMuQWQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkVkPSExO3RyeXt0aGlzLmIuZGkoKX1jYXRjaChnKXt9dGhpcy5HZD0hMDt0aGlzLmIuQWUoKTt0aGlzLmFjPSExO3RoaXMud2UoKS5FaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5RZSgpO3RoaXMuYy5wYyYmKGE/dGhpcy5jLm9yaWdpbi5waCgpOnRoaXMucGUoKSl9ZWxzZSB0aGlzLnBlKCl9LApSdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMueGYoYSkpfSx4ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5icCgpO3RoaXMuYy5vcmlnaW4udGcody5UZCl9LGlpOmZ1bmN0aW9uKCl7aWYodGhpcy5udil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5HZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsueWMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnJ2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlBkPSEwO2UudihrLmppLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkZlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmtmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1oKSkmJihjPXRoaXMuYy5rZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuRWR8fCh0aGlzLkVkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLldmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLlZiPXRoaXMuWWM9ITEsdGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkVkPSExLHRoaXMuYi5kaSgpLHRoaXMuYy5vcmlnaW4uUWUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5XYy5yZXBsYWNlKCJbdGltZV0iLGUuQmcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5lZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGFpOmZ1bmN0aW9uKCl7dGhpcy51aHx8KHRoaXMudWg9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2UudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5iaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmFpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5haSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLk9oKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwuamImJgp0aGlzLllhKCJzdGFydCIpLGUudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlBmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKgp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmJpPWEpfSxOaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sTHU6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LE9oOmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxNdTpmdW5jdGlvbigpe2UuS2QoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLktkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5BZnx8dGhpcy5MLmpiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmpiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMudmQmJnRoaXMudmQudHJhY2smJnRoaXMudmQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuVHEodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5qZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkZkLmltcHJlc3Npb25zJiYKZS5McihnLnVybCx0aGlzLkZkLmltcHJlc3Npb25zKT90aGlzLkplKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Lbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5GZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSmUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnlwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5BZiYmKGI9Il92cGFpZCIpO3RoaXMuQ2YmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sSmU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5QbihjKSxmfHwKKGY9dGhpcy5yZyksZXx8KGU9dGhpcy5yZyksdGhpcy5SbihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LERoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LG5wOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sT3U6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuY2NbYl0mJmErKztyZXR1cm4gYX0sVHE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx5cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLlB2LmJpbmQodGhpcykpfSxQdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sTnY6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuV2MucmVwbGFjZSgiW3RpbWVdIixlLkJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuJGMmJihiPXRoaXMuTC4kYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLAoxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZ2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnNwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLApmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlhoLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06CihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnF2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucHYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgoobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuTWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5rZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwKKHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksCmMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlBlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQmZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx3ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sR2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0scHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LHF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5yYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnJiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5yYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxQZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm1mKCkpfSxwZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmplJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnNofHwhdGhpcy5MLlJjJiYic3BpZWdlbC5kZSIhPWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5lZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm1nKCkpOih0aGlzLnNoPXRoaXMuQ2Y9dGhpcy5CZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmplPSEwLGE9ZS5jZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5LZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbWc6ZnVuY3Rpb24oYSl7dGhpcy5PdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoITApfS5iaW5kKHRoaXMpLHRoaXMuZ3QpOih0aGlzLkdkPSEwLHRoaXMuYi5BZSgpLHRoaXMuYi5idSgpLHRoaXMuYWM9ITEsCmUudihrLnJwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy53ZSgpLkVoKCkpfSx3ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkVlKHRoaXMudmlkZW8sYSk/dGhpcy5HaCgpOnRoaXMud2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5VYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnJjJiYwPHRoaXMucmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnJjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5MbysiLSIrdGhpcy5sZjt0aGlzLmMmJnRoaXMuYy5IZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSGcoKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ma3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGo9dGhpcy5hWzVdO3RoaXMua289dGhpcy5hWzJdO3RoaXMuUnM9dGhpcy5hWzhdO3RoaXMubHc9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy50bj1iO2IucHJvdG90eXBlPXtzajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGo6dGhpcy5qbyhhKX0sam86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmtvOgp0aGlzLlFzKGEpfSxRczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnM6dGhpcy5rdyhhKX0sa3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmx3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy50bnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuc2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLmhzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLlNtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmhkKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5EYShiLHRoaXMuZ3MuYmluZCh0aGlzKSx0aGlzLmRzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5RcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5WdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxRcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuTHQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9CnRoaXMuRGcoKTt0aGlzLnNjPXRoaXMucGYoKTt0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEucmVzcG9uc2VVUkw7dGhpcy5ZLmxlbmd0aD90aGlzLkljKCk6dGhpcy5zYSh0aGlzLlNhKHcuUGMse2Vycm9yOnRoaXMuemY/Ry5XZDpHLklmfSkpfSxoczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpO3RoaXMucWM9dGhpcy5UaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sZHM6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5IZix7ZGVwdGg6YX0pKX0sSWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5TcigpP3RoaXMuZXYoKT8oYSsrLApuZXcgYih0aGlzLHRoaXMuTWcoKSxoLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMuc2EodGhpcy5TYSh3LktmKSk6KGE9MCx0aGlzLkR2KCkmJnRoaXMuVmUodGhpcy53cCgpKSl9LFFlOmZ1bmN0aW9uKCl7dGhpcy5zYz8odGhpcy5zYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5RZSgpfSxwaDpmdW5jdGlvbigpe3RoaXMucWM/KHRoaXMucWM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQucGgoKX0sRHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idigpP3RoaXMuYXYoKT8hMDooLTEhPXRoaXMuQ2MoKT90aGlzLnNhKHRoaXMuU2Eody5TZCkpOnRoaXMuc2EodGhpcy5TYSh3LkRmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5QYyxHLkpmKSksITEpfSxWZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5RZHx8KGEuUWQ9CltdKTthLlFkLnB1c2godGhpcy5TZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk1lKCkpO2EudGI9YS50Yj9hLnRiOnRoaXMuc2M7YS5wYz1hLnBjP2EucGM6dGhpcy5xYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5wYXJlbnQuVmUoYSl9LHdwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuQ2MoKTthLk89dGhpcy5KZygpO2EuVWI9dGhpcy5EcSgpO2EuS3Y9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5BcSgpO2Eua2Y9dGhpcy5ScShhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLnpnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT13LlNkLmNvZGU/Yi5QYS5jb25jYXQodGhpcy5FcSgpKTpiLlBhLmNvbmNhdCh0aGlzLk1xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuV2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sZXY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxidjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuSmcoKS5sZW5ndGh9LAphdjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQ2MoKX0scGY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxUaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucGYoKSYmKGE9ITApO3JldHVybiBhfSxMdDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk1nKCkubGVuZ3RofSxNZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwKIlZBU1RBZFRhZ1VSSSIpfSxCcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwiQWRTeXN0ZW0iKX0sTWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy4kZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LCRnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuJGcoYS5wYXJlbnROb2RlKToKITF9LE1xOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxEcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxKZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSwKang6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsCmM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMubmQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LENjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxScTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd1KGQsYSksMD5iJiYKKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLlNtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllrPXRoaXMuYVszXTt0aGlzLk1zPQp0aGlzLmFbN107dGhpcy5rcD10aGlzLmFbMTBdO3RoaXMuWm49dGhpcy5hWzddO3RoaXMucHQ9dGhpcy5hWzVdO3RoaXMuVXU9dGhpcy5hWzhdO3RoaXMueHY9dGhpcy5hWzEwXTt0aGlzLnlrPXRoaXMuYVs3XTt0aGlzLmh2PXRoaXMuYVs4XTt0aGlzLnZpPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuWXA9YjtiLnByb3RvdHlwZT17WGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zazp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTXM6dGhpcy5qcChhKX0sanA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtwOnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abjp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucHQ6dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV1OnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy54djoKdGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlrOnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5odjp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLllwfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Yayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlViPSIiO3RoaXMuQj10aGlzLnBjPXRoaXMudGI9ITE7dGhpcy5CZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuQ2U9IiJ9Yy5SbD1iO2IucHJvdG90eXBlPXtvcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSwKYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxLcTpmdW5jdGlvbigpe2lmKCF0aGlzLkJlJiYKdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkdhKXt2YXIgYT10aGlzLm9yaWdpbi5HYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkJlPWFbY10pfXJldHVybiB0aGlzLkJlfSxIZzpmdW5jdGlvbigpe2lmKHRoaXMuQ2UpcmV0dXJuIHRoaXMuQ2U7dmFyIGE9IiI7KGE9dGhpcy5LcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuQ2U9YX0sVnE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLlJsfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuaW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMV19Yy5pdD1iO2IucHJvdG90eXBlPXtobzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLml0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5obyg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LERmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxQYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCk9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEx3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSWk9dGhpcy5hWzldO3RoaXMuQXc9dGhpcy5hWzEwXTt0aGlzLnlyPXRoaXMuYVsyXTt0aGlzLkFyPXRoaXMuYVsxXTt0aGlzLnZ3PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuSXA9YjtiLnByb3RvdHlwZT17SGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklpOnRoaXMuencoYSl9LHp3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bdzp0aGlzLnhyKGEpfSx4cjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXI6dGhpcy56cihhKX0senI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Bcjp0aGlzLnV3KGEpfSx1dzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLklwfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5IaSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmdkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuU2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlNqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zcj10aGlzLmFbMTBdO3RoaXMuVmk9dGhpcy5hWzFdO3RoaXMubG49dGhpcy5hWzRdO3RoaXMueHE9CnRoaXMuYVszXTt0aGlzLlVyPXRoaXMuYVs0XTt0aGlzLkN2PXRoaXMuYVsxXTt0aGlzLmpqPXRoaXMuYVs4XTt0aGlzLnltPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuenQ9YjtiLnByb3RvdHlwZT17WHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLllyOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5WaTp0aGlzLmtuKGEpfSxrbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubG46dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhxOnRoaXMuVHIoYSl9LFRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vcjp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy55bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLnp0fHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5Ycig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuRmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5OZD1bXTt0aGlzLkNoPVtdO3RoaXMuUmU9W107dGhpcy5Rdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMuWms9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5GaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZoW2FdLApjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLkV4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlp0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLlF0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz0KYztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuTmQucHVzaCh7c3JjOmMsZnJhbWU6ZyxodDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5SZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlJlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy5GcShhKSl9fSxGcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntOeDohMCxNeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntBeDoidmlkZW8iLFB4OiJqc0N1c3RvbSIsUXg6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxSeDoxLApreDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LFVxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5OZC5sZW5ndGg7YisrKWlmKHRoaXMuTmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5OZFtiXS5odDtyZXR1cm4iIn0sWnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkNoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlVxKGIpLHZlbmRvcjpifSk7dGhpcy5LdSgpfSxRdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuUXYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSwKYil9LmJpbmQodGhpcykpOnRoaXMuYWcoYSxiKX0sYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLlJlLnB1c2goe3R5cGU6YSxWbzpiLEt4OiExfSl9LEt1OmZ1bmN0aW9uKCl7dGhpcy5DaC5tYXAoZnVuY3Rpb24oYSl7YS5Pcnx8KGEuRHgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLk94LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Pcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5aa3x8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXU9dGhpcy5hWzldO3RoaXMub3c9dGhpcy5hWzhdO3RoaXMud3U9dGhpcy5hWzldO3RoaXMuc2w9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5vcj1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmV1OnRoaXMubncoYSl9LG53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vdzp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud3U6dGhpcy5ybChhKX0scmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnNsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5vcnx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuZHUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5pYj1hLkVnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmJnPSExO3RoaXMuVGI9W119Yy51aj1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnpxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5rcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDsKZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUnU6ZnVuY3Rpb24oKXt0aGlzLmJnPSEwfSxkaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5mLnMoKSl9LGJ1OmZ1bmN0aW9uKCl7dGhpcy5iZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZGQsdGhpcy5mLnMoKSkpfSxqZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5pYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5pYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTt0aGlzLmYuTGMmJnRoaXMuZi5MYygpP3RoaXMuZi5FZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LGtyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx0cTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249Yi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSwkYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRxKHRoaXMuaWIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQWUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkxjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9CmIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUuUGgodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy4kYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEFlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTsKZm9yKHZhciAkYT1jLnVqfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy4kcD10aGlzLmFbMV07dGhpcy5Cbz10aGlzLmFbNF07dGhpcy5NbD10aGlzLmFbNF07dGhpcy54bj10aGlzLmFbMV07dGhpcy5Ybj10aGlzLmFbNF07dGhpcy52dj0KdGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5pdz1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMub286dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRwOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cbzp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWw6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhuOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ybjp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudnY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5pd3x8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLm5vKDQpOyhmdW5jdGlvbihjKXtjLkRsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5CZChiKTt0aGlzLnBnKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKSl9LApwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxBYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkOwpiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGNiPWMuRGx8fGNiOyhmdW5jdGlvbihjKXtjLkNsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kYSgpO3RoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5UZj10aGlzLlZmPXRoaXMuV2c9dGhpcy5lYT10aGlzLnNmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuV2cmJnRoaXMuamcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmYS5hYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmJkKCk7dGhpcy5XZz0hMDt0aGlzLmpnKCl9LmJpbmQodGhpcykpO3RoaXMuZmcoKX0samc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5iZCgpO2lmKCF0aGlzLnNmJiYhdGhpcy5iZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuc2YmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LApLZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxmZzpmdW5jdGlvbigpe2lmKHRoaXMuYmQoKSl7dmFyIGI9dGhpcy5LZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9Yi5oeH10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LGx4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLnl4KCk6ITF9LENjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/CmIuQ2MoKTotMX0sTnE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLlNiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5EZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLk5xKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBkYj1jLkNsfHxkYjsoZnVuY3Rpb24oYyl7Yy5FbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFByOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlZsLkFuLnluP3dpbmRvdy5PTy5WbC5Bbi55bi5meChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnhlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYywKdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBlYj1jLkVsfHxlYixmYj1uZXcgZWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXA9dGhpcy5hWzhdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuYWo9dGhpcy5hWzFdO3RoaXMuZHI9dGhpcy5hWzRdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMuaHI9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzhdO3RoaXMucGs9dGhpcy5hWzNdO3RoaXMuR2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbN119Yy5GcD1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuJGkoYSl9LCRpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5hajp0aGlzLmNyKGEpfSxjcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhPwp0aGlzLmRyOnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kbjp0aGlzLmdyKGEpfSxncjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaHI6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnVyOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wazp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5GcHx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuRHAoNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk5nKCl9LApOZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy55aCgpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuZmp8fGhiOyhmdW5jdGlvbihjKXtjLmVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSwKdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmdnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2coYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuZWp8fGliOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCkJoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zcXx8KHRoaXMuc3E9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkJoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5CaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuZ2p8fGpiLFQ9bmV3IGpiKHIpO1QuZygpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xbD10aGlzLmFbOF07dGhpcy5zcj10aGlzLmFbNV07dGhpcy5JdT10aGlzLmFbMTBdO3RoaXMuY289dGhpcy5hWzldO3RoaXMuRnc9dGhpcy5hWzhdO3RoaXMuR209dGhpcy5hWzhdO3RoaXMuQ2o9dGhpcy5hWzhdO3RoaXMuam49dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMV19Yy50cD1iO2IucHJvdG90eXBlPXtwbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWw6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNyOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JdTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY286dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZ3OnRoaXMuRm0oYSl9LEZtOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuR206dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMudHB8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnBsKDQpOyhmdW5jdGlvbihjKXtjLnJtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ybXx8VTsoZnVuY3Rpb24oYyl7Yy5xbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIisKYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guVmMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5OcyhhKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5acSgpfSxOczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7CnJldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn19dGhpcy51KCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMucW18fFY7KGZ1bmN0aW9uKGMpe2Muc209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUuQnAoYix0aGlzLnVkKSk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMudWR8fCh0aGlzLnVkPVtdKSx0aGlzLnVkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSwKZnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5IY3x8KHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChiKSx0aGlzLmF1KCkmJih0aGlzLmJmKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LFpxOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGI9MDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPQowO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LmZ2KGIpfX0pfSkoYyk7dmFyIGxiPWMuc218fGxiLHg9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWo9dGhpcy5hWzhdO3RoaXMuU2k9dGhpcy5hWzJdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMuYnM9dGhpcy5hWzJdO3RoaXMuem89dGhpcy5hWzNdO3RoaXMuZXE9dGhpcy5hWzNdO3RoaXMuYW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNl19Yy5MbT1iO2IucHJvdG90eXBlPXt6ajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFqOnRoaXMuUmkoYSl9LApSaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU2k6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBvOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5iczp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem86dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVxOnRoaXMuJG4oYSl9LCRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1iPWMuTG18fG1iLE9jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLnpqKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7CnRoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LEFhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuYmp8fG5iOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLmNqfHxvYjsoZnVuY3Rpb24oYyl7Yy5kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTihnKXx8Cih0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLmRqfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzldO3RoaXMuQWs9dGhpcy5hWzldO3RoaXMuS2o9dGhpcy5hWzJdO3RoaXMuZnI9dGhpcy5hWzRdO3RoaXMuUWs9dGhpcy5hWzEwXTt0aGlzLndqPXRoaXMuYVs1XTt0aGlzLmlxPXRoaXMuYVs5XTt0aGlzLkN3PXRoaXMuYVszXTt0aGlzLkl0PXRoaXMuYVsxMF07dGhpcy5WcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX0KYy5Xbz1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ0OnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuS2o6dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZyOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Razp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2o6dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pcTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3c6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkl0OnRoaXMuVXAoYSl9LFVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5Xb3x8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuZXQoNCk7KGZ1bmN0aW9uKGMpe2MudWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuUHQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sUHQ6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiYKdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFhnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMudWx8fHNiOyhmdW5jdGlvbihjKXtjLnRsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5taT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5taSYmKHRoaXMuRygpLHRoaXMubWk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnRsfHx0YjsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBiPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy52bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLnhpPXRoaXMuYVsxXTt0aGlzLnZxPXRoaXMuYVszXTt0aGlzLndyPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuU3M9YjtiLnByb3RvdHlwZT17ZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVrOnRoaXMud2koYSl9LAp3aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGk6dGhpcy51cShhKX0sdXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZxOnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy53cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuU3N8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmRrKDQpOyhmdW5jdGlvbihjKXtjLlltPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7CnZhciB3Yj1jLlltfHx3YjsoZnVuY3Rpb24oYyl7Yy5YbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxYYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sTnQ6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy50Yz0KITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5OdCh0aGlzLkNhKToodGhpcy5DYT10aGlzLlhiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpO3JldHVybn1pZighdGhpcy50Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTsKZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLlhtfHx4YjsoZnVuY3Rpb24oYyl7Yy5abT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuWm18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudnA9dGhpcy5hWzVdO3RoaXMuUG09dGhpcy5hWzEwXTt0aGlzLnBzPXRoaXMuYVs2XTt0aGlzLmRsPXRoaXMuYVszXTt0aGlzLk1pPXRoaXMuYVsyXTt0aGlzLkNpPXRoaXMuYVs5XTt0aGlzLmFtPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVsyXTt0aGlzLnFvPXRoaXMuYVszXTt0aGlzLm9sPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuWnI9YjtiLnByb3RvdHlwZT17dXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZwOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QbTp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucHM6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NaTp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ2k6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5hbTp0aGlzLnptKGEpfSx6bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQW06dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFvOnRoaXMubmwoYSl9LG5sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuWnJ8fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLnVwKDQpOyhmdW5jdGlvbihjKXtjLmNtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5XZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucnQoKX0uYmluZCh0aGlzKSw1MDApfSxydDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLldlJiYKd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LE51OmZ1bmN0aW9uKCl7dGhpcy5XZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuY218fEJiOyhmdW5jdGlvbihjKXtjLmJtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ucz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMua2N8fCh0aGlzLmtjPQowLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5ucz8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuTnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLmJtfHxDYjsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuZG18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bj10aGlzLmFbM107dGhpcy5qbT10aGlzLmFbNl07CnRoaXMuU2s9dGhpcy5hWzNdO3RoaXMuQ3I9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5XbD1iO2IucHJvdG90eXBlPXt1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5pbShhKX0saW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmptOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tazp0aGlzLkJyKGEpfSxCcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLldsfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1TYy51big0KTsoZnVuY3Rpb24oYyl7Yy5ZbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5ZbHx8R2I7KGZ1bmN0aW9uKGMpe2MuWGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuS2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnBwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMubWQoKTsKMDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy4kcigpOnRoaXMuaWcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxwcDpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5tKCEwKX0sJHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7IWIucWEmJmIuWSYmYi5leCYmYi5neCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGlnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PQpiPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCl9LmJpbmQodGhpcyksMTAwKX0sbWQ6ZnVuY3Rpb24oKXtpZighdGhpcy50aClmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuS2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudGg9YltjXSk7cmV0dXJuIHRoaXMudGh9LHp4OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLm1kKCkuYWRzTG9hZGVyP3RoaXMuRyghMCk6dGhpcy5HKCk6dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBIYj1jLlhsfHxIYjsoZnVuY3Rpb24oYyl7Yy5abD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgSGIoYyx0aGlzLkkpKS5nKCkpfXJldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgSWI9Yy5abHx8SWIsSmI9bmV3IEliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBxPXRoaXMuYVsxMF07dGhpcy5xcj10aGlzLmFbN107dGhpcy5PbD10aGlzLmFbMTBdO3RoaXMuRXQ9dGhpcy5hWzhdOwp0aGlzLnR3PXRoaXMuYVsxMF07dGhpcy50dj10aGlzLmFbOF07dGhpcy5CbD10aGlzLmFbM107dGhpcy5saj10aGlzLmFbM107dGhpcy5ubT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLnhwPWI7Yi5wcm90b3R5cGU9e29xOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wcTp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXI6dGhpcy5ObChhKX0sTmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9sOnRoaXMuRHQoYSl9LER0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5FdDp0aGlzLnN3KGEpfSxzdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHc6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR2OnRoaXMuQWwoYSl9LEFsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CbDp0aGlzLmtqKGEpfSxrajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGo6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMubm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnhwfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5vcSg0KTsoZnVuY3Rpb24oYyl7Yy5Waz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7SCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlcoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LAp4eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Wa3x8WDsoZnVuY3Rpb24oYyl7Yy5Vaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhlPWIuaWQpO0g/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGUmJmIhPXRoaXMuWGV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmCiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkZ4KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy51KCJhZGVycm9yIiksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFk9Yy5Va3x8WTsoZnVuY3Rpb24oYyl7Yy5Xaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/CiExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWChiKSxiLm5hP3RoaXMuYmYoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEgsTGI9Yy5Xa3x8TGIsTWI9bmV3IExiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jaj10aGlzLmFbMTBdO3RoaXMuWmk9dGhpcy5hWzRdOwp0aGlzLmJxPXRoaXMuYVs2XTt0aGlzLmdsPXRoaXMuYVszXTt0aGlzLllxPXRoaXMuYVs4XTt0aGlzLm5qPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3M9YjtiLnByb3RvdHlwZT17SGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLklqOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5aaTp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnE6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmdsOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ZcTp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLktzfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuSGooNCk7KGZ1bmN0aW9uKGMpe2MuYWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSxhJiZjPyh0aGlzLlcoYyksdGhpcy5aKGEpKTp0aGlzLmNhKCkpOnRoaXMuY2EoKTp0aGlzLmNhKCk6dGhpcy5jYSgpfSxmdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LEN4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuYWt8fE9iOyhmdW5jdGlvbihjKXtjLiRqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpezEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IiwKZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMub2EoKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIFBiPWMuJGp8fFBiOyhmdW5jdGlvbihjKXtjLmJrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7Ynx8KGI9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYiYmYi5HZXRBbGxQbGF5ZXJzJiYoYj1iLkdldEFsbFBsYXllcnMoKSkmJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm5hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5ia3x8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5SbT10aGlzLmFbNF07dGhpcy55dT10aGlzLmFbNF07dGhpcy50cz10aGlzLmFbMl07dGhpcy55aj10aGlzLmFbM107dGhpcy5Fcz10aGlzLmFbOF07dGhpcy5IcD10aGlzLmFbM107dGhpcy5qcj10aGlzLmFbNl07dGhpcy54bz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsyXX1jLnRtPWI7Yi5wcm90b3R5cGU9e1FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5SbTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXU6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRzOnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55ajp0aGlzLkRzKGEpfSxEczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRXM6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhwOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuanI6dGhpcy53byhhKX0sd286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy50bXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuUW0oNCk7KGZ1bmN0aW9uKGMpe2MuZm49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuVyhhKX1lbHNlIHRoaXMuY2EoKX0sCkxkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxPdDpmdW5jdGlvbigpe3RoaXMuUmQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuUmQ9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX19LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLmZufHxUYjsoZnVuY3Rpb24oYyl7Yy5lbj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxTdDpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksCmIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSl9LGFkOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpOwphLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sTmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0wO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuYWQod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk5mLmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuU3Qod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5OZigpO3RoaXMuUnQoKX0sUnQ6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLAp0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oKXt9KX0sbTpmdW5jdGlvbihiKXt0aGlzLk10P3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbigpe3RoaXMuTXQ9ITB9fSl9KShjKTt2YXIgVWI9Yy5lbnx8VWI7KGZ1bmN0aW9uKGMpe2MuZ249dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5PdCgpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7CnZhciBWYj1jLmdufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLkFwPXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzZdfWMud209YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5tOnRoaXMuenAoYSl9LHpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5BcDp0aGlzLnFqKGEpfSxxajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLndtfHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy5NbSg0KTsKKGZ1bmN0aW9uKGMpe2MuSW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy53aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLkNzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxmdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLAphPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMud2gmJih0aGlzLndoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy5JbXx8TzsoZnVuY3Rpb24oYyl7Yy5IbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnJ1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKaGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLkhtfHxQOyhmdW5jdGlvbihjKXtjLkptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuYmYoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLkptfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9CnRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuY2s9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkd0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5ja3x8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnQoNCk7KGZ1bmN0aW9uKGMpe2MuTms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Naz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuYmgoKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnFiKCksITA7dGhpcy5UZysrO2lmKDEwPAp0aGlzLlRnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmguYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PQp0eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPwoodGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLk1rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Paz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsCnRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLk9rfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHY9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbN119Yy5rbD1iO2IucHJvdG90eXBlPXtrdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLmtsfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMua3YoNCk7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaGcoKX0sCmhnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5Xanx8ZWM7KGZ1bmN0aW9uKGMpe2MuWWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz0KbmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmx0PXRoaXMuYVs0XTt0aGlzLk1wPXRoaXMuYVsyXTt0aGlzLldzPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzVdfWMuVG09YjtiLnByb3RvdHlwZT17a3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmx0OnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NcDp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLldzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuVG18fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmt0KDQpOyhmdW5jdGlvbihjKXtjLnBpPQpwLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5waXx8aWM7KGZ1bmN0aW9uKGMpe2Mub2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMub2l8fGpjOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj0KbmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMucml8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56bD10aGlzLmFbN107dGhpcy56aT10aGlzLmFbOV07dGhpcy5ubj10aGlzLmFbMTBdO3RoaXMuQXU9dGhpcy5hWzFdO3RoaXMuWHA9dGhpcy5hWzFdO3RoaXMucW49CnRoaXMuYVsyXTt0aGlzLlFpPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbNV07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5XaT1iO2IucHJvdG90eXBlPXt5bDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpsOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56aTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubm46dGhpcy56dShhKX0senU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF1OnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5YcDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucW46dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFpOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Zczp0aGlzLnFrKGEpfSxxazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucms6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5XaXx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMueWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZWg9dGhpcy5naD10aGlzLmZoPSExO3RoaXMueGQ9W107dGhpcy5hZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYj8KbnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBFYj9udWxsOkViLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgemI/bnVsbDp6YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBsYz8KbnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuVGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5PcShhKTpbXSxiO3RoaXMuZ2g9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZmg9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuSGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmFmKXtpZih0aGlzLmVoKWJyZWFrO2I9dGhpcy5hZltjXTt0aGlzLnZmKGIpJiYodGhpcy54ZC5wdXNoKGIpLHRoaXMuSGgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxPcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSwKUHU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmZoKWZvcih0aGlzLmVoPSEwLGE9MDthPHRoaXMueGQubGVuZ3RoO2ErKyl0aGlzLnhkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGRbYV0uTGIpfX19KShjKTt2YXIgbmM9Yy5UbHx8bmMsTT1uZXcgbmM7TS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWW89dGhpcy5hWzldO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMucnc9dGhpcy5hWzFdO3RoaXMudm89dGhpcy5hWzEwXTt0aGlzLk12PXRoaXMuYVszXTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLlNvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzldfWMuS209YjtiLnByb3RvdHlwZT17WG86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLllvOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Obzp0aGlzLnF3KGEpfSwKcXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJ3OnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52bzp0aGlzLkx2KGEpfSxMdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk12OnRoaXMudXMoYSl9LHVzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52czp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYz1jLkttfHxvYyxhZD1uZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5Ybyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOgoiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQmMoay5FdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuQmMoay5JcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLApyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLllnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWWcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtJLmthKCk7dmFyIGNkPWJkKGZ1bmN0aW9uKCl7ZS55Zyh3aW5kb3csSS5FcigpLHtpZDpjZH0pfSw1MDApLGlhPWUuYWEoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenY9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMl19Yy5ibD1iO2IucHJvdG90eXBlPXt5djpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPWMuYmx8fHBjLGRkPW5ldyBwYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWRkLnl2KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy54aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMuc2Q9MDt0aGlzLmJiPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0saXU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxodTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oYSxiKXtlLmZhKCJ3ZWx0LmRlIikmJmUuYWIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5IcigpKXRoaXMubGIubCh0aGlzLmxiLm9kLHRoaXMubGIud2EsdGhpcy5sYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLkFjKTsKZWxzZSBpZih0aGlzLmFyKCkpdGhpcy5jdShmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudihrLnljLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3ICRhKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5SdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLm9iKCJuZXdIb21hZERpc3BsYXkiKTtSPWw9bmV3IFJhKGwsdGhpcy5sYixnKTtsLmd1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5tcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sCmcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuS2UoYSxjLGYpO3RoaXMucGxheWVyLkpoKGwpfX0sSHI6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxiPTA7aWYodGhpcy5zZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLnNkLmdldFRpbWUoKSx0aGlzLnNkPWEsM0U1PGI/ITA6ITE7dGhpcy5zZD1hO3JldHVybiExfSxFdTpmdW5jdGlvbigpe2Uub2IoInByZXJvbGwiKTtlLmZmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0sRHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7CmUub2IoInBvc3Ryb2xsIik7dGhpcy5udSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy51ZyhjKSk/dGhpcy5NYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxWdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnR1KHRoaXMuRHUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTsKaWYoIXRoaXMubWgpe3RoaXMubWg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuTWMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZGQsdGhpcy5wbGF5ZXIucygpKSl9fSxVdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLm11KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuRXUoKTt0aGlzLnBsYXllci5OZSYmdGhpcy5VdCgpO3RoaXMuVnQoKX0sV3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9CjA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMueWQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLkR3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy56ZD10aGlzLnlkLmxlbmd0aH0sYXI6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPHRoaXMuemQmJihhPSEwKTtyZXR1cm4gYX0sY3U6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLnh0LmJpbmQodGhpcykpfSx4dDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0sbXM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTsKcmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnNpfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFwPXRoaXMuYVsxXTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLlVzPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMuVGk9YjtiLnByb3RvdHlwZT17UHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFwOnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlRpfHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9ZWQuUHAoNCl9KS5jYWxsKGthZWNoYWVNQW9sYWVidVosa2FlY2hhZU1Bb2xhZWJ1Wik7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.47.137 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.137.47.251.148.clients.your-server.de
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Mon, 07 Oct 2019 02:05:43 GMT
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:24 GMT
Server
AmazonS3
Etag
"063da71572f57793ea4125f50b418f84"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Homad-Instance
de34-homad-4
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.giga.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
t.png
gocp.stroeermediabrands.de/
98 B
355 B
Image
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&_=1570413943453.1450815275
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

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:43 GMT
Last-Modified
Fri, 04 Oct 2019 12:53:59 GMT
ETag
"5d9740e7-62"
Content-Type
image/png
Cache-Control
max-age=31536000, public
X-Machine
hn87 gocp env
Accept-Ranges
bytes
Content-Length
98
segments
api.theadex.com/v0.9/pub/
56 B
126 B
Script
General
Full URL
https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
Requested by
Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
85.114.144.106 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Mon, 07 Oct 2019 02:05:43 GMT
content-length
56
content-type
text/plain; charset=utf-8
p.min.js
cdn.emetriq.de/adp/profiling/0.2.18/
5 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/69511/default.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20eb:6800:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 25 Sep 2019 11:24:10 GMT
content-encoding
gzip
last-modified
Wed, 25 Sep 2019 11:08:07 GMT
server
AmazonS3
age
1003294
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
fTNde0ZXM.BzDu33z6pL5eJgKGxahMla
status
200
cache-control
max-age=31536000, no-transform, public
x-amz-cf-pop
FRA2-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
473DbfR6sBySupCZz5iB8OX82ySC1BMgogpr7ISwmWsktcJqZUSKgQ==
via
1.1 59d92388a3a66e5f245f384a437fa025.cloudfront.net (CloudFront)
hic_qos
ssl.1.damoh.giga.de/ Frame 92E8
24 B
409 B
XHR
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,dmFyIGthZWNoYWVNQW9sYWVidVo9a2FlY2hhZU1Bb2xhZWJ1Wnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5pdShtKTthLmh1KGwpO2EuV3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5xdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzldfWMuRnU9YjtiLnByb3RvdHlwZT17Rm46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkduOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LcDp0aGlzLkRtKGEpfSxEbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRW06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYT1jLkZ1fHxoYSxzYz1uZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRm4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuTmM9W107dGhpcy5uZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnd0LmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5SZz17fTt0aGlzLmRmPSExfWMuaGs9YjtiLnByb3RvdHlwZT17UXU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrdGhpcy5uYltiXSsiXyIpO3JldHVybiBhfSxZYjpmdW5jdGlvbigpe3RoaXMuZGZ8fCh0aGlzLmRmPWUuYWEoMTApKTtyZXR1cm4gdGhpcy5kZn0sb2I6ZnVuY3Rpb24oYSl7dGhpcy5uYlthXXx8KHRoaXMubmJbYV09MCk7dGhpcy5uYlthXSs9MTs1PHRoaXMubmJbYV0mJiF0aGlzLlJnW2FdJiYodGhpcy5SZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIiwKdGhpcy5RdSgpLCEwKSl9LG5lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFVuOmZ1bmN0aW9uKGEpe3RoaXMuYmEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx3dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy52dChhLmRhdGEpfSwKdnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmJhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lciYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxnZTpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxvZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkdnKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5qaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sR2c6ZnVuY3Rpb24oYSl7dmFyIGI9Cm5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFNuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMuemEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS55cShhKSlyZXR1cm47KGI9dGhpcy5vZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09CmF9fSx5cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSx3ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUnI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0seGU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxGZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PQp0eXBlb2YgZD9kOm51bGx9LFBoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTsKdmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTtxPWcuaGVpZ2h0Kmcud2lkdGg7ZD1nLndpZHRoO2Y9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEZlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWUoYS5lbCwKYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihiKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LEhiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSx6ZTpmdW5jdGlvbihhKXt2YXIgYj0KMCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LEtoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixxLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLG09MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2gocSk7c3dpdGNoKG4lCjQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eT1rO3U9bTtyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHEsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSwKdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHEsNSkrKG4meXxuJnV8eSZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChxLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2U9ZStxJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O209bSt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihtKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksCmY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHE+PjYsZz1xJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihxKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sTnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSwKaGQ6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxxPSExLGM9ITEsZT0hMSxnPSExLGs9ITEsbT0hMSxsPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlRiPyEwOiExfWNhdGNoKHUpe310cnl7cT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwKLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPXE7YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LGxyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LAokbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sVGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxmbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEpvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWGkoKXx8YS5oaigpfHxhLmxyKCl8fGEuRmwoKXx8YS4kbSgpfHxhLlRrKCl8fGEuZm0oKX19O3JldHVybiBudWxsIT1hLkpvKCl9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscT1hLmxlbmd0aDtmPHE7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sWmI6ZnVuY3Rpb24oYSl7YT10aGlzLnphKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sUXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy56YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LEJwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LEd1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5jaShiKSsiOiIrdGhpcy5jaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sY2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGZmOmZ1bmN0aW9uKGEpe3RoaXMuQ2I9YX0seWc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5DYjt0aGlzLmNlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7CmEuZGlzcGF0Y2hFdmVudChmKX0sQmM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLnlnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHEsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3EmJihCPWsuVGEoQixxKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuQmMoQil9LHl0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmIuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuUXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxKdTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuWWIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmNlKGEpfSxjZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnl0KGEpO2lmKGIpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bS5KYygpO20ueWEoYSwhMCk7YT1tLnlhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO20uRGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uSmMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwptLnlhKGYsITApO2Y9bS55YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkRhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sS2Q6ZnVuY3Rpb24oYSl7aWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bS5KYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1tLnlhKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO20uRGEoYSl9fSxMZTpmdW5jdGlvbigpe20mJm0uVj9tLmlzRW5hYmxlZCYmbS5jcCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sY2c6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkdlKGEpfHx0aGlzLlJyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guY2YmJndpbmRvdy5zYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMud2coYSkpcmV0dXJuIHRoaXMud2coYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYWIoYSxiLkxhLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnFkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLlNuKGUsYSk7cmV0dXJuIGV9LGFiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIGw9ZXx8bTtlPSEwO2smJihlPSExKTtpZihsJiZsLlYpaWYobC5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtsLnlhKGEsZSk7ZT1sLnlhKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtlLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHIgaW4gZCllLmRhdGFbcl09ZFtyXTtyZXR1cm4gbC5EYShlLGYsYywiIiwiIixnKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYSxiLGQsZixjLGwsZyxrKX0uYmluZCh0aGlzKSw1MDApfSxqaDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fAo0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxrKSxsLndpdGhDcmVkZW50aWFscz1lLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKHIpe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuamgoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuTmMpZm9yKHZhciBjIGluIHRoaXMuTmMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5OY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueGIoYSk7ZCYmCihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sa2g6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihhLGYuTGEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLmZzKGYucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LApxdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5OYz1hfSxEdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOgpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sS286ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LExyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLmhrfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT0KYXx8e319Yy5naz1iO2IuVGE9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLmp0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkhzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuanE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlhmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlBmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLAptZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuVWY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuWWY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLkpuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLlNmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuSnY9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkdzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmtxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IucHc9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iua2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ycD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuZGQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi55Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuV2Y9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkxuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuVWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLiRkPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLmJlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5Lbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iuamk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Kcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnRkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnRmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07CmIubGc9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkZ2PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRXY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Jcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7CnZhciBrPWMuZ2t8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzEwXTt0aGlzLnRvPXRoaXMuYVszXTt0aGlzLldyPXRoaXMuYVs1XTt0aGlzLmJ0PXRoaXMuYVsxMF07dGhpcy5Ebz10aGlzLmFbM107dGhpcy5Qcz10aGlzLmFbMTBdO3RoaXMuSG89dGhpcy5hWzddO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMuR2k9dGhpcy5hWzJdO3RoaXMuS2k9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5ScD1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSW46dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnRvOnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xcjp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnQ6dGhpcy5DbyhhKX0sQ286ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuRG86dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBzOnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ibzp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS3c6dGhpcy5GaShhKX0sRmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5HaTp0aGlzLkppKGEpfSxKaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2k6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLlJwfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Ibig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmlrPWI7Yi5wcm90b3R5cGU9e3plOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09CmEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LExxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LApsZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubGQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxFcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxZZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnplKHRoaXMuTHEoKSsiIiksCmE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaWt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMuT2k9dGhpcy5hWzVdO3RoaXMuRWk9dGhpcy5hWzhdO3RoaXMubnE9dGhpcy5hWzEwXTt0aGlzLmhtPXRoaXMuYVs0XTt0aGlzLkhrPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuR3c9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1sOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53azp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhPwp0aGlzLk9pOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRWk6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ucTp0aGlzLmdtKGEpfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaG06dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5Hd3x8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MubGwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsCmY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLm9qPWJ9KShjKTt2YXIgTD1jLm9qfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNuPXRoaXMuYVs3XTsKdGhpcy5Vbz10aGlzLmFbMl07dGhpcy5DdT10aGlzLmFbOF07dGhpcy54cz10aGlzLmFbNF07dGhpcy5Fbj10aGlzLmFbNl07dGhpcy5Gbz10aGlzLmFbMl07dGhpcy5Kaz10aGlzLmFbN107dGhpcy5hbD10aGlzLmFbNF07dGhpcy5PcD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs5XX1jLnJvPWI7Yi5wcm90b3R5cGU9e0JuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVW86dGhpcy5CdShhKX0sQnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN1OnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54czp0aGlzLkRuKGEpfSxEbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRW46dGhpcy5FbyhhKX0sRW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkZvOnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLiRrKGEpfSwKJGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFsOnRoaXMuTnAoYSl9LE5wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5PcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucm98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLkJuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuU2w9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5NYT17fTt0aGlzLkk9bnVsbDt0aGlzLktjPTEwMDt0aGlzLkliPTA7dGhpcy5XYT0xNTA7dGhpcy5MYj0wO3RoaXMuanUoYil9LGc6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhPyh0aGlzLkliKyssdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLktjKSk6CjA+dGhpcy5XYSYmKHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5LYykpfSxhdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkliPnRoaXMuV2E/ITA6ITF9LGJmOmZ1bmN0aW9uKCl7dGhpcy5JYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sanU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LEpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuUCgpLCEwKTt0aGlzLk1hW2IubGEoKV09YjtNJiZNLmdoJiZNLlB1KGIpfSxyeDpmdW5jdGlvbigpe3JldHVybiBlLnhlKHRoaXMuTWEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX0sTXI6ZnVuY3Rpb24oYil7Yj1iLkthKCk7Zm9yKHZhciBhIGluIHRoaXMuTWEpaWYoYi5pZD09CnRoaXMuTWFbYV0uS2EoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sSng6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5TbHx8dDsoZnVuY3Rpb24oYyl7Yy5VbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLktjPTEwO3RoaXMuSWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubmE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkJiPSIiO3RoaXMucWc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5LYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxNOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30sCnR1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSxzeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LG11OmZ1bmN0aW9uKGIpe3RoaXMuT2U9Yn0scXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZX0sTmU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhJiYodGhpcy5JYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuS2MpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpOwplbHNlIHJldHVybiExfWNhdGNoKGIpe319LEVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2EoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuYnIoKXx8dGhpcy5ObigpO3RoaXMuQmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSx0eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxObjpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5hYSgxMCkpfSxicjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sVzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj0KYn0sS2E6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmF9LGNhOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMH0sTGM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxJZTpmdW5jdGlvbigpe3JldHVybiExfSxKaDpmdW5jdGlvbihiKXt0aGlzLkJiPWJ9LHB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmJ9LEVoOmZ1bmN0aW9uKCl7dGhpcy5CYj1udWxsfSx2eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuQmImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLnFnfHwodGhpcy5xZz0hMCl9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLlVsfHxwOyhmdW5jdGlvbihjKXtjLnRpPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5JPXRoaXMucGxheWVyPSIiO3RoaXMuTGY9IjEiO3RoaXMuTWY9IjIiO3RoaXMuem49IjMiO3RoaXMuUWM9MDt0aGlzLm5oPQozMDt0aGlzLlJiPVtdO3RoaXMuZ2I9W107dGhpcy5vYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5aZj10aGlzLmZpPSExO3RoaXMuc3RhdHVzPXRoaXMuUWM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLmdmKGIpO3RoaXMua3UoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5maXx8KHRoaXMuZmk9ITAsZS5MZSgpKX0sU2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxEcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5rYSgpXXx8KHdpbmRvd1thLmthKCldPXt9KTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldfHwod2luZG93W2Eua2EoKV1bYi5sYSgpXT17fSx3aW5kb3dbYS5rYSgpXVtiLmxhKCldLmluaXRpYXRvcj0KZS5ZYigpKTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWWIoKV0/d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldKys6d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldPTF9LEpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLmhmKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMueGEoKSl7dGhpcy5EcigpO2lmKCF0aGlzLkpyKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmhmKCk7cmV0dXJufXRoaXMuaGYoKTt0aGlzLkkodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLlpoKCk7dGhpcy5aZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSx1OmZ1bmN0aW9uKGIsCmEpe3RoaXMueGEoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmdiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxaaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuZ2Ipe2Zvcih2YXIgaD0wO2g8dGhpcy5nYi5sZW5ndGg7aCsrKXRoaXMub2NbdGhpcy5nYltoXS5yZWFzb25dPT10aGlzLm9jW2JdJiZhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLHRoaXMub2NbdGhpcy5nYltoXS5yZWFzb25dPHRoaXMub2NbYl0mJihhPVtdLGEucHVzaCh0aGlzLmdiW2hdLmRldGFpbCksYj10aGlzLmdiW2hdLnJlYXNvbik7dGhpcy5vY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITAsYSl9fSx1eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlpmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZn0saGY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxydTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuem59LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5RY30sUmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTGZ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk1mfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5RY30sZ2Y6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxrdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxqczpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMudGl8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR0PXRoaXMuYVsyXTt0aGlzLiRzPXRoaXMuYVsxMF07dGhpcy55dz10aGlzLmFbN107dGhpcy5pbD10aGlzLmFbNl07dGhpcy5Naj10aGlzLmFbN107dGhpcy5Maz10aGlzLmFbMV07dGhpcy5mbz10aGlzLmFbNV07dGhpcy5ncT10aGlzLmFbOV07dGhpcy5tcD10aGlzLmFbOV07dGhpcy5udD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs5XX1jLm1rPWI7Yi5wcm90b3R5cGU9e2N0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kdDp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy54dyhhKX0seHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnl3OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pbDp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5LayhhKX0sS2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5Mazp0aGlzLmVvKGEpfSxlbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZm86dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdxOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5tcDp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLm1rfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5jdCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87CnRoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Uanx8b2E7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLmR4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7CmIuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuVWp8fHBhOyhmdW5jdGlvbihjKXtjLlZqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Wanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmJuPXRoaXMuYVsxXTt0aGlzLm5yPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuQXQ9YjtiLnByb3RvdHlwZT17dW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZtOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLmJuOnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubnI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkF0fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy51bSg0KTsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5xcD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5iYz0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5XKGIpfSwKeGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KSwKYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJgozMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyOwphLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Da3x8c2E7KGZ1bmN0aW9uKGMpe2MuQms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYKKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ29tcGxldGUiKTsKdGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnFwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTt0aGlzLlNlKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMudygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJnRoaXMuVGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy53KCksdGhpcy5yYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sanM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8odGhpcy5yZT50aGlzLnNlJiYoYj0hMSksdGhpcy5HKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSw1MCk6KGEudmcoKSxhLnhnKCksYS5iY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ca3x8dGE7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5HcSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLk1yKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sb3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sR3E6ZnVuY3Rpb24oKXt2YXIgYj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB1YT1jLkRrfHx1YSx2YT1uZXcgdWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFqPXRoaXMuYVsxXTt0aGlzLlR2PXRoaXMuYVs0XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5sbT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLmpsPWI7Yi5wcm90b3R5cGU9e1BqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Rajp0aGlzLlN2KGEpfSxTdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHY6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJzOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMuamx8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlBqKDQpOwooZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0KITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHhhPWMuVm18fHhhOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLkNhPXRoaXMuWGM9ITE7dGhpcy5BaD1lLkhiKDEwKTt0aGlzLmVpPSEwO3RoaXMudGM9dGhpcy5WZz0hMTt0aGlzLkZzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5xaCgpLHRoaXMuWm8oKSx0aGlzLnFiKCkpfSxGczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmNvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLAoiOyIsYi5KP2IuSi5xYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaGU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5oZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkFoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJgoodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxYYjpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSWc6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSwKS3I6ZnVuY3Rpb24oKXtpZighdGhpcy5VZyl7dmFyIGI9dGhpcy55YigpLGE9dGhpcy5JcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVWc9ITApfXJldHVybiB0aGlzLlVnfSxJcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuWGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlhjPSEwKTtyZXR1cm4gdGhpcy5YY30scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLlR0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sVHQ6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuSWcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudWM9ITA7aWYoZS5mYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLnVjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxueDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMubmcmJmIuYWRzJiYodGhpcy5uZz1iLmFkcyk7cmV0dXJuIHRoaXMubmd9LFpvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdhKCEwKTt0aGlzLnUoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5TZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPQohMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLklnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0scWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuS3IoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpOwp0aGlzLnliKCl9ZWxzZSB0aGlzLlZnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpLGI9dGhpcy5YYigpO2EmJiFiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZ2EoKSk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlZnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPQphLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LCRvOmZ1bmN0aW9uKCl7dGhpcy56Y3x8KHRoaXMuemM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnpjIT0KYi5hZHMuc3RhdGUmJih0aGlzLnpjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuemM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRvKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpezA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5laT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5HKHRoaXMuZWksZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGhwOmZ1bmN0aW9uKCl7dGhpcy53eHx8KDEwPHRoaXMuVXY/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5VdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLiR0KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhwKCl9LmJpbmQodGhpcyksNTApKSl9LCR0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlZ2KXt0aGlzLlZ2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciB5YT1jLlVtfHx5YTsoZnVuY3Rpb24oYyl7Yy5XbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5RaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUWgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS54ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwKKG5ldyB5YShhLHRoaXMuSSkpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxUOmZ1bmN0aW9uKCl7dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLktjKX19KX0pKGMpO3ZhciB6YT1jLldtfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGw9dGhpcy5hWzEwXTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm5rPWI7Yi5wcm90b3R5cGU9e0dsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5IbDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLm5rfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuR2woNCk7KGZ1bmN0aW9uKGMpe2MuSmw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5VZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7CmQmJmEmJmEuYWMmJigwPD1oLmluZGV4T2YoZCl8fGEud2QoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlVlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlVlKys7aWYoMTA8dGhpcy5VZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuSmx8fENhOyhmdW5jdGlvbihjKXtjLklsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8Cih0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudGU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5xcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLnFxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucXQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuSWx8fERhOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLktsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXc9dGhpcy5hWzVdO3RoaXMuanY9dGhpcy5hWzNdO3RoaXMuc249dGhpcy5hWzFdO3RoaXMuenM9dGhpcy5hWzddO3RoaXMubW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy5BaT1iO2IucHJvdG90eXBlPXtIdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXc6dGhpcy5pdihhKX0saXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmp2OnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zbjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenM6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9CmMuQWl8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLkh3KDQpOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkZnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMudXQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy51dCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxncDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCkllOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy50a3x8SGE7KGZ1bmN0aW9uKGMpe2Muc2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMuc2t8fElhOyhmdW5jdGlvbihjKXtjLnVrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLnVrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRms9dGhpcy5hWzhdO3RoaXMudHQ9dGhpcy5hWzhdO3RoaXMuT2o9dGhpcy5hWzNdO3RoaXMuUWw9dGhpcy5hWzVdO3RoaXMuR3I9dGhpcy5hWzJdO3RoaXMubHM9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5Saj1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRms6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnR0OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Pajp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWw6dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdyOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMubHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYT1jLlJqfHxMYSxEYz1uZXcgTGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuams9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sbHU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxQbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmprfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmgsZCxmKXt0aGlzLmZiPWE7dGhpcy5BZz10aGlzLm5pPSExO3RoaXMucmg9ZDt0aGlzLlJoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLmZiPW5ldyB6KGEpKTt2YXIgYz10aGlzLnNiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkhlKHRoaXMuZmIudXJsKSYmbS5NZCl7dmFyIGU9bmV3IHooYS51cmwpO2UubHUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uaWEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5raz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5mYi5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5BZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuUmg/dGhpcy5zYi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCExKTp0aGlzLnNiLm9wZW4odGhpcy5mYi5tZXRob2QsdGhpcy5mYi51cmwsITApLHRoaXMubml8fCh0aGlzLnNiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5zYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuc2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuc2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkhlKHRoaXMuZmIudXJsKT9tLk1kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSGUodGhpcy5mYi51cmwpLHRoaXMucmgmJnRoaXMucmgoKX1yZXR1cm4gdGhpcy5zYn19fSkoYyk7dmFyIE1hPWMua2t8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLlZkPSExfWMucGo9YjtiLnByb3RvdHlwZT17cHU6ZnVuY3Rpb24oYSl7dGhpcy5WZD1hfSxvdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LFl0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e053OiJBZENsaWNrVGhydSIsUHc6IkFkRXJyb3IiLFF3OiJBZFN0b3BwZWQiLFR3OiJBZExpbmVhckNoYW5nZSIsVXc6IkFkVGFnUGFyc2VkIixYdzoiQWRWaWRlb0NvbXBsZXRlIiwkdzoiQWRMb2FkZWQiLGF4OiJBZFNraXBwZWQiLGJ4OiJBZFN0YXJ0ZWQiLFJ3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsU3c6IkFkSW1wcmVzc2lvbiIsT3c6IkFkQ3JlYXRpdmVWaWV3IixWdzoiQWRWaWRlb01pZHBvaW50IixXdzoiQWRQYXVzZWQiLFl3OiJBZFZpZGVvU3RhcnQiLFp3OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuVmQsYltkXSl9LFh0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVWQpZm9yKHZhciBiIGluIHRoaXMuSGEuVWQpdGhpcy5IYS5VZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVWRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuVmQmJnRoaXMuWXQoKTt0aGlzLkhhJiZ0aGlzLlh0KCl9fX0pKGMpO3ZhciBOYT1jLnBqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmllPQp0aGlzLnZjPXRoaXMud2I9bnVsbDt0aGlzLkNwPXRoaXMuSmI9dGhpcy5paD0hMTt0aGlzLkxhPSIiO3RoaXMuZGg9ITE7dGhpcy53YT10aGlzLm9kPSIiO3RoaXMuWmc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuJGU9ITE7dGhpcy5wYT1bXTt0aGlzLk9nPXRoaXMuZmM9IiI7dGhpcy5xZT0hMTt0aGlzLnFmPTA7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuSWQ9W107dGhpcy5nYz0iIjt0aGlzLnJmPTA7dGhpcy52aWRlb3BsYXphPQp7fTt0aGlzLkRjPSExO3RoaXMuaXA9dGhpcy5PZD1udWxsO3RoaXMuTGg9dGhpcy5sYz10aGlzLnNnPXRoaXMudWY9dGhpcy5NZD10aGlzLmtlPXRoaXMuUmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5wZD0wO3RoaXMuUWc9ITE7dGhpcy5QZz0xRTM7dGhpcy5aYz0hMTt0aGlzLlFhPTFFMzt0aGlzLk9mPSIifWMubGs9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy53YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLnZjLGFkdGFncmVnZXg6dGhpcy5pZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5paCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5DcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmRoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLndhLAppc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuWmcsc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZmMsaG9tYWRBZHBhdGg6dGhpcy5PZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnFmLEhPTUFEX1ZFUklGSUVEOnRoaXMuR2YsSE9NQURfQkxPQ0tFRDp0aGlzLkVmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm5jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5GZix0ZXN0SGlkZTp0aGlzLmhjLHRlc3RUYWdzOnRoaXMuaWMsdGVzdFRhZ3NKUzp0aGlzLmpjLHRlc3RUYWdzWEhSOnRoaXMuSWQsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMucmYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmlwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUmMsCmJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5rZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5NZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy51Zixjb25maWdGYWlsdXJlczp0aGlzLmhiLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLkloLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5qYix2cGFpZDp0aGlzLmxjLHNraXBBbGxvd2VkOnRoaXMuTGgsdm1hcHM6dGhpcy5raSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuWmMsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sJHE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmKGE9ITApO3JldHVybiBhfSxlZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSxIcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2JdJiYxPT10aGlzLmhiW2JdJiZhLnB1c2goYik7CnJldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLktvKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuR2UoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuRmMoKT9lPWE6ZT1jLnByb3RvY29sKwoiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLkpjKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMud2N8fHRoaXMud2J8fHRoaXMudmN8fHRoaXMuaWUpJiYoZz10aGlzLnJzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuSXEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxHZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT8KYj0hMDp0aGlzLkZjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxGYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5HZShhKTtyZXR1cm4gYn0sSXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PQp0eXBlb2YgdGhpcy5MYSYmMDx0aGlzLkxhLmxlbmd0aClyZXR1cm4gdGhpcy5MYTtmb3IoZCBpbiB0aGlzLkxhKWlmKGI9dGhpcy5MYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLml4O3JldHVybiJub25lIn0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLkloXX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnFkKCksYj10aGlzLktoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LG9oOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LHFzOmZ1bmN0aW9uKGEsCmIpe3ZhciBkPWUuemEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLm9oKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5vaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LHJzOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJgooYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy52YyYmKGE9dGhpcy5xcyhhLHRoaXMudmMpKTtyZXR1cm4gYX0sZnA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuYXAodGhpcy5GYS5jbGllbnRBUElzKX0sYXA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLnB1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5vdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5kaD0hMDt0aGlzLm9kPWE7dGhpcy53YT1iO3RoaXMuJGU9ZDt0aGlzLk9kPWY7dGhpcy5BYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5mcCgpO3RoaXMuZXMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5jcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLndhKXRyeXt0aGlzLndhPWIsdGhpcy54YygpfWNhdGNoKGspe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9fSxwYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sZXM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMub2QrdGhpcy5mZSgiZ2xvYmFsIikpLHRoaXMuV3EuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sY3M6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5mZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sZmU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2Upe3RoaXMua2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQWM9ITEpO3RoaXMuQWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5BYz90aGlzLkFjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5aZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuRWYpKTt0aGlzLk5iKCk7ZS5CYyhrLmp0KTsoYj1lLlpiKHRoaXMucWQoKSkpfHwoYj1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxXcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZmN8fHRoaXMuTGF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8Cm51bGw7dGhpcy5PZz1hLmFkcGF0aHx8IiI7dGhpcy5xZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkloPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZmMmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuR2MoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEdjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuSmMoKSksZD10aGlzLnphKHRoaXMuZmMpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPQoiUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuZmMrdGhpcy5mZSgiY3VzdG9tZXIiKSk7dGhpcy5EYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImN1c3RvbWVyIik7YT90aGlzLmVtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZW09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxTdTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkRjPSEwO3RoaXMuR2MoITApO3JldHVybn19dGhpcy5NZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuc2c9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmpiPQp0aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaGM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5qYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy53Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnZjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5pZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5paD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmxjPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5sYzt0aGlzLkxoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuJGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmtpPWIudm1hcHN8fCIiO3RoaXMuWmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8CjFFMzt0aGlzLk9mPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmdjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuUHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnFlJiYodGhpcy5nYz1udWxsKTt0aGlzLnJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkRjPSEwLHRoaXMuR2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMubXYoKSYmKHRoaXMuaGN8fHRoaXMuamN8fHRoaXMuaWN8fHRoaXMuZ2N8fHRoaXMuSWQpP3RoaXMuJGU/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSksdGhpcy5tZSgpLHRoaXMuTmIoKSk6dGhpcy5ZdSgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlp1KCkpfX0sWXU6ZnVuY3Rpb24oKXt0aGlzLlh1KCk7CnRoaXMuJHUoKX0sJHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsCiIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9CmQpe3ZhciBjPWUuaGQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxadTpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpO3RoaXMuTmIoKX0sT2M6ZnVuY3Rpb24oYSl7dGhpcy5SYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIoYSkpLHRoaXMuTmIoKSx0aGlzLm1lKCkpfSxYdTpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmhoKCkpdGhpcy5PYyh0aGlzLm5jLAoibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5WaCgpfX1lbHNlIHRoaXMuVmgoKX0sVWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLkhiKCkpO3RoaXMuY3YoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm5mLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuaWM9dGhpcy5JZCkmJnRoaXMuaWMubGVuZ3RoKXt2YXIgZD10aGlzLmljLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubmYoKX0sY3Y6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGMsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5VaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5qYyYmdGhpcy5qYy5sZW5ndGgpe3ZhciBkPXRoaXMuamMuc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5VaCgpfSxkdjpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nYz8odGhpcy5xZisrLHRoaXMuRGEobmV3IHoodGhpcy5nYyksdGhpcy5XdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5vZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlNoKCl9LG9mOmZ1bmN0aW9uKGEpe3RoaXMuT2ModGhpcy5GZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LFd1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnFmP3RoaXMubmYoKTp0aGlzLm9mKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuU2goKTp0aGlzLm9mKCJBQUEiKX0sU2g6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5tZSgpfSxoaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUmMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaGgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5PZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk9kJiZ0aGlzLk9kKCl9LGVwOmZ1bmN0aW9uKCl7aWYodGhpcy51ZiYmdGhpcy4kcSgpKXt2YXIgYT10aGlzLkhxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxaaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnBkfHwodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlBnJiYhdGhpcy5RZyYmKHRoaXMuUWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlBnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5uaT0hMCk7cSYmZS5OcigpJiYoYS5BZz0hMCk7ZyYmKGEuUmg9ITApO3JldHVybiBhLmxvYWQoKX0sYnA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxWdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMua2l9LGNwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMuSXYuYmluZCh0aGlzKSx0aGlzLkh2LmJpbmQodGhpcykpfSxJdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMubHEoKX0sSHY6ZnVuY3Rpb24oKXt9LApscTpmdW5jdGlvbigpe2UuQmMoay5rcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYWIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxtdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnJmfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmxrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucG09dGhpcy5hWzFdO3RoaXMuQ209dGhpcy5hWzJdO3RoaXMueGw9dGhpcy5hWzRdO3RoaXMuQ3Q9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMl19Yy5aaj1iO2IucHJvdG90eXBlPXtvbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucG06dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNtOnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueGw6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMuWmp8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLm9tKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmJiPWEuZi5QKCk6dGhpcy5iYj0iIjthLmYuWGcmJmEuZi5YZyh7cGF1c2U6dGhpcy53ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkdoLmJpbmQodGhpcyksbXV0ZTp0aGlzLlBlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuQXYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5pYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlZiPXRoaXMuWWM9ITE7dGhpcy5Jbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkZkPXt9O2Uub2IoIm5ld0JpZ0FkSWQiKTt0aGlzLkxvPWUuYWEoMTApO3RoaXMubGY9MDt0aGlzLldjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuV2M9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYKKGE9dGhpcy5iLmYucygpKSx0aGlzLldjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlZuPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuc2g9dGhpcy5FZD0hMTt0aGlzLmxoPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5lZT0hMTt0aGlzLmJpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYWM9ITE7dGhpcy5zcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5NaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5QZD10aGlzLk9iPXRoaXMub2U9dGhpcy5lZD10aGlzLkdkPXRoaXMucmI9dGhpcy5tYz10aGlzLnVoPXRoaXMua2Q9dGhpcy5udj10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5yYz1bXTt0aGlzLmNjPXt9O3RoaXMuZ3Q9MjAwO3RoaXMuQmY9CnRoaXMuQ2Y9dGhpcy5qZT10aGlzLkFmPXRoaXMuWmU9ITE7dGhpcy52ZD17fX1jLmZrPWI7Yi5wcm90b3R5cGU9e2d1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGJ9LCRoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkNiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5MdSgpO2UudihrLkxuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEtlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5sZisrLGUub2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5lcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJgp0aGlzLkwuaXNFbmFibGVkPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmxjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuJGgoKSxuZXcgUyh0aGlzLGEsdGhpcy5saCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5sYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7CmVsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLktlKGEsYixjKX0sNTApfX0sVmU6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5rZD0hMTt0aGlzLmM9YTt0aGlzLnV1KHRoaXMuYyk7dGhpcy52ZD1uZXcgUWEodGhpcy5jLkt2LHRoaXMudmlkZW8se30pO3RoaXMuTGcoYSk7dGhpcy5yYz10aGlzLkNnKGEpO3RoaXMubnAoKX0sTGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuRmQ9dGhpcy5TcShhKSksdGhpcy5MZyhhLnBhcmVudCkpfSxDZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuQ2coYS5wYXJlbnQpKSxjLnB1c2godGhpcy5DcShhKSkpO3JldHVybiBjfSwKQ3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LFNxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8CmYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5rYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZ2QmJmEuZ2QuZXJyb3ImJmEuZ2QuZXJyb3IuY29kZSYmKGI9YS5nZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlBjLmNvZGU6Yj09Ry5XZC5jb2RlP2UudihrLmh3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpOihlLkxlKCksYj09Ry5KZi5jb2RlJiZlLnYoay5Hcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5qcSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuTXUoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmUudihrLkp2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLnYoay5wdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUudihrLnd3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5Icyx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsuRnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsuR3YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuV2IoYSk7dGhpcy5SYSgpfSxXYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLkplKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSx1dTpmdW5jdGlvbihhKXt0aGlzLm9lPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTsKdGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5aZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLkl4PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7CnRoaXMuVm4mJnRoaXMucGxheWVyLnVlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci51ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuUW4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLlplJiZiLmxvYWQoKTtpZih0aGlzLldoKGIpKXt0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt0aGlzLlRuKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5aZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz0KdGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLm9wKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5zdSgpKTp0aGlzLmMub3JpZ2luLnRnKHcuVGQpfSxzdTpmdW5jdGlvbigpe3RoaXMuQWY9ITA7dGhpcy5yYj10aGlzLm1jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnJiPSEwKTtlLm5lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlVuKHRoaXMuYy5vcmlnaW4udmEpOwp0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnZoKCk7dGhpcy5iLmpmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5qZigpO3RoaXMudGE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmdpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuVnEoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuY2coImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmdlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuR2QmJnRoaXMuYi5mLkFhKCkmJmUudihrLnljLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi4kYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5yYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuWHYoKSx0aGlzLmIuJGIoITApLCF0aGlzLk9iKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsCmNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLiRiKCEwKSx0aGlzLmV3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN3KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR3KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZncoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuYncoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubGkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9CmEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlViKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmtnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5aYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuYmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT0KYS5kYXRhLm5hbWUmJih0aGlzLkNmJiYodGhpcy5CZj0hMSx0aGlzLmVjKCkpLHRoaXMuWnYoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnJiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpOwplLmdlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuZ2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuJGYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubWM9ITB9LFp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSk7dGhpcy5tYz0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLk9oKCk7ZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sZXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sY3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5rZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSl9LGR3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxidzpmdW5jdGlvbigpe3RoaXMud2YoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxsaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm5lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSwKV3Y6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmd3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5saSghMCl9LFFuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5GYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5Sdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LApXaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sVG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxBZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5oaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxoaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMueWYoYSl9LmJpbmQodGhpcyksdGhpcy5JbykpfSx5ZjpmdW5jdGlvbihhKXtpZighdGhpcy5ZYyYmdGhpcy5XaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLlZiKXt0aGlzLlljPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5BZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnNnfHwKdGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuT3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5qZigpO3RoaXMuTnYoKTt0aGlzLmdpKCk7dGhpcy5kZygpO3RoaXMuYi52aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5tZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLmVkfHx0aGlzLlFmKCl9LFFmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZWR8fChhP3RoaXMuUmEoKToodGhpcy5QZSghMCksdGhpcy5RZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0uYmluZCh0aGlzKTt0aGlzLndlKCkuSmgodGhpcyl9LHdmOmZ1bmN0aW9uKCl7dGhpcy5MLmpiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkpuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxNbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkdnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuSnUoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlFkJiZ0aGlzLk1uKHRoaXMuYy5RZCk7CmlmKCF0aGlzLm9lKWlmKHRoaXMub2U9ITAsdGhpcy5QZHx8KGUudihrLkpzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucGMpe2Uub2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMubGYrKzt0aGlzLlZiPXRoaXMuWWM9ITE7dHJ5e3RoaXMuQWQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkVkPSExO3RyeXt0aGlzLmIuZGkoKX1jYXRjaChnKXt9dGhpcy5HZD0hMDt0aGlzLmIuQWUoKTt0aGlzLmFjPSExO3RoaXMud2UoKS5FaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5RZSgpO3RoaXMuYy5wYyYmKGE/dGhpcy5jLm9yaWdpbi5waCgpOnRoaXMucGUoKSl9ZWxzZSB0aGlzLnBlKCl9LApSdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMueGYoYSkpfSx4ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5icCgpO3RoaXMuYy5vcmlnaW4udGcody5UZCl9LGlpOmZ1bmN0aW9uKCl7aWYodGhpcy5udil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5HZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsueWMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnJ2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlBkPSEwO2UudihrLmppLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkZlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmtmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1oKSkmJihjPXRoaXMuYy5rZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuRWR8fCh0aGlzLkVkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLldmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLlZiPXRoaXMuWWM9ITEsdGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkVkPSExLHRoaXMuYi5kaSgpLHRoaXMuYy5vcmlnaW4uUWUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5XYy5yZXBsYWNlKCJbdGltZV0iLGUuQmcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5lZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGFpOmZ1bmN0aW9uKCl7dGhpcy51aHx8KHRoaXMudWg9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2UudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5iaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmFpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5haSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLk9oKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwuamImJgp0aGlzLllhKCJzdGFydCIpLGUudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlBmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKgp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmJpPWEpfSxOaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sTHU6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LE9oOmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxNdTpmdW5jdGlvbigpe2UuS2QoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLktkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5BZnx8dGhpcy5MLmpiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmpiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMudmQmJnRoaXMudmQudHJhY2smJnRoaXMudmQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuVHEodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5qZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkZkLmltcHJlc3Npb25zJiYKZS5McihnLnVybCx0aGlzLkZkLmltcHJlc3Npb25zKT90aGlzLkplKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Lbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5GZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSmUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnlwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5BZiYmKGI9Il92cGFpZCIpO3RoaXMuQ2YmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sSmU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5QbihjKSxmfHwKKGY9dGhpcy5yZyksZXx8KGU9dGhpcy5yZyksdGhpcy5SbihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LERoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LG5wOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sT3U6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuY2NbYl0mJmErKztyZXR1cm4gYX0sVHE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx5cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLlB2LmJpbmQodGhpcykpfSxQdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sTnY6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuV2MucmVwbGFjZSgiW3RpbWVdIixlLkJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuJGMmJihiPXRoaXMuTC4kYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLAoxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZ2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnNwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLApmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlhoLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06CihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnF2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucHYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgoobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuTWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5rZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwKKHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksCmMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlBlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQmZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx3ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sR2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0scHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LHF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5yYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnJiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5yYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxQZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm1mKCkpfSxwZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmplJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnNofHwhdGhpcy5MLlJjJiYic3BpZWdlbC5kZSIhPWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5lZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm1nKCkpOih0aGlzLnNoPXRoaXMuQ2Y9dGhpcy5CZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmplPSEwLGE9ZS5jZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5LZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbWc6ZnVuY3Rpb24oYSl7dGhpcy5PdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoITApfS5iaW5kKHRoaXMpLHRoaXMuZ3QpOih0aGlzLkdkPSEwLHRoaXMuYi5BZSgpLHRoaXMuYi5idSgpLHRoaXMuYWM9ITEsCmUudihrLnJwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy53ZSgpLkVoKCkpfSx3ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkVlKHRoaXMudmlkZW8sYSk/dGhpcy5HaCgpOnRoaXMud2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5VYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnJjJiYwPHRoaXMucmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnJjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5MbysiLSIrdGhpcy5sZjt0aGlzLmMmJnRoaXMuYy5IZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSGcoKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ma3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGo9dGhpcy5hWzVdO3RoaXMua289dGhpcy5hWzJdO3RoaXMuUnM9dGhpcy5hWzhdO3RoaXMubHc9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy50bj1iO2IucHJvdG90eXBlPXtzajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGo6dGhpcy5qbyhhKX0sam86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmtvOgp0aGlzLlFzKGEpfSxRczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnM6dGhpcy5rdyhhKX0sa3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmx3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy50bnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuc2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLmhzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLlNtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmhkKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5EYShiLHRoaXMuZ3MuYmluZCh0aGlzKSx0aGlzLmRzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5RcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5WdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxRcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuTHQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9CnRoaXMuRGcoKTt0aGlzLnNjPXRoaXMucGYoKTt0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEucmVzcG9uc2VVUkw7dGhpcy5ZLmxlbmd0aD90aGlzLkljKCk6dGhpcy5zYSh0aGlzLlNhKHcuUGMse2Vycm9yOnRoaXMuemY/Ry5XZDpHLklmfSkpfSxoczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpO3RoaXMucWM9dGhpcy5UaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sZHM6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5IZix7ZGVwdGg6YX0pKX0sSWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5TcigpP3RoaXMuZXYoKT8oYSsrLApuZXcgYih0aGlzLHRoaXMuTWcoKSxoLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMuc2EodGhpcy5TYSh3LktmKSk6KGE9MCx0aGlzLkR2KCkmJnRoaXMuVmUodGhpcy53cCgpKSl9LFFlOmZ1bmN0aW9uKCl7dGhpcy5zYz8odGhpcy5zYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5RZSgpfSxwaDpmdW5jdGlvbigpe3RoaXMucWM/KHRoaXMucWM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQucGgoKX0sRHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idigpP3RoaXMuYXYoKT8hMDooLTEhPXRoaXMuQ2MoKT90aGlzLnNhKHRoaXMuU2Eody5TZCkpOnRoaXMuc2EodGhpcy5TYSh3LkRmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5QYyxHLkpmKSksITEpfSxWZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5RZHx8KGEuUWQ9CltdKTthLlFkLnB1c2godGhpcy5TZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk1lKCkpO2EudGI9YS50Yj9hLnRiOnRoaXMuc2M7YS5wYz1hLnBjP2EucGM6dGhpcy5xYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5wYXJlbnQuVmUoYSl9LHdwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuQ2MoKTthLk89dGhpcy5KZygpO2EuVWI9dGhpcy5EcSgpO2EuS3Y9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5BcSgpO2Eua2Y9dGhpcy5ScShhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLnpnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT13LlNkLmNvZGU/Yi5QYS5jb25jYXQodGhpcy5FcSgpKTpiLlBhLmNvbmNhdCh0aGlzLk1xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuV2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sZXY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxidjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuSmcoKS5sZW5ndGh9LAphdjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQ2MoKX0scGY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxUaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucGYoKSYmKGE9ITApO3JldHVybiBhfSxMdDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk1nKCkubGVuZ3RofSxNZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwKIlZBU1RBZFRhZ1VSSSIpfSxCcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwiQWRTeXN0ZW0iKX0sTWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy4kZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LCRnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuJGcoYS5wYXJlbnROb2RlKToKITF9LE1xOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxEcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxKZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSwKang6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsCmM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMubmQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LENjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxScTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd1KGQsYSksMD5iJiYKKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLlNtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllrPXRoaXMuYVszXTt0aGlzLk1zPQp0aGlzLmFbN107dGhpcy5rcD10aGlzLmFbMTBdO3RoaXMuWm49dGhpcy5hWzddO3RoaXMucHQ9dGhpcy5hWzVdO3RoaXMuVXU9dGhpcy5hWzhdO3RoaXMueHY9dGhpcy5hWzEwXTt0aGlzLnlrPXRoaXMuYVs3XTt0aGlzLmh2PXRoaXMuYVs4XTt0aGlzLnZpPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuWXA9YjtiLnByb3RvdHlwZT17WGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zazp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTXM6dGhpcy5qcChhKX0sanA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtwOnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abjp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucHQ6dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV1OnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy54djoKdGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlrOnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5odjp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLllwfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Yayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlViPSIiO3RoaXMuQj10aGlzLnBjPXRoaXMudGI9ITE7dGhpcy5CZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuQ2U9IiJ9Yy5SbD1iO2IucHJvdG90eXBlPXtvcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSwKYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxLcTpmdW5jdGlvbigpe2lmKCF0aGlzLkJlJiYKdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkdhKXt2YXIgYT10aGlzLm9yaWdpbi5HYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkJlPWFbY10pfXJldHVybiB0aGlzLkJlfSxIZzpmdW5jdGlvbigpe2lmKHRoaXMuQ2UpcmV0dXJuIHRoaXMuQ2U7dmFyIGE9IiI7KGE9dGhpcy5LcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuQ2U9YX0sVnE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLlJsfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuaW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMV19Yy5pdD1iO2IucHJvdG90eXBlPXtobzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLml0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5obyg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LERmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxQYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCk9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEx3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSWk9dGhpcy5hWzldO3RoaXMuQXc9dGhpcy5hWzEwXTt0aGlzLnlyPXRoaXMuYVsyXTt0aGlzLkFyPXRoaXMuYVsxXTt0aGlzLnZ3PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuSXA9YjtiLnByb3RvdHlwZT17SGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklpOnRoaXMuencoYSl9LHp3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bdzp0aGlzLnhyKGEpfSx4cjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXI6dGhpcy56cihhKX0senI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Bcjp0aGlzLnV3KGEpfSx1dzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLklwfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5IaSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmdkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuU2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlNqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zcj10aGlzLmFbMTBdO3RoaXMuVmk9dGhpcy5hWzFdO3RoaXMubG49dGhpcy5hWzRdO3RoaXMueHE9CnRoaXMuYVszXTt0aGlzLlVyPXRoaXMuYVs0XTt0aGlzLkN2PXRoaXMuYVsxXTt0aGlzLmpqPXRoaXMuYVs4XTt0aGlzLnltPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuenQ9YjtiLnByb3RvdHlwZT17WHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLllyOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5WaTp0aGlzLmtuKGEpfSxrbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubG46dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhxOnRoaXMuVHIoYSl9LFRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vcjp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy55bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLnp0fHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5Ycig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuRmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5OZD1bXTt0aGlzLkNoPVtdO3RoaXMuUmU9W107dGhpcy5Rdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMuWms9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5GaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZoW2FdLApjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLkV4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlp0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLlF0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz0KYztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuTmQucHVzaCh7c3JjOmMsZnJhbWU6ZyxodDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5SZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlJlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy5GcShhKSl9fSxGcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntOeDohMCxNeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntBeDoidmlkZW8iLFB4OiJqc0N1c3RvbSIsUXg6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxSeDoxLApreDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LFVxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5OZC5sZW5ndGg7YisrKWlmKHRoaXMuTmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5OZFtiXS5odDtyZXR1cm4iIn0sWnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkNoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlVxKGIpLHZlbmRvcjpifSk7dGhpcy5LdSgpfSxRdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuUXYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSwKYil9LmJpbmQodGhpcykpOnRoaXMuYWcoYSxiKX0sYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLlJlLnB1c2goe3R5cGU6YSxWbzpiLEt4OiExfSl9LEt1OmZ1bmN0aW9uKCl7dGhpcy5DaC5tYXAoZnVuY3Rpb24oYSl7YS5Pcnx8KGEuRHgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLk94LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Pcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5aa3x8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXU9dGhpcy5hWzldO3RoaXMub3c9dGhpcy5hWzhdO3RoaXMud3U9dGhpcy5hWzldO3RoaXMuc2w9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5vcj1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmV1OnRoaXMubncoYSl9LG53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vdzp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud3U6dGhpcy5ybChhKX0scmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnNsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5vcnx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuZHUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5pYj1hLkVnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmJnPSExO3RoaXMuVGI9W119Yy51aj1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnpxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5rcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDsKZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUnU6ZnVuY3Rpb24oKXt0aGlzLmJnPSEwfSxkaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5mLnMoKSl9LGJ1OmZ1bmN0aW9uKCl7dGhpcy5iZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZGQsdGhpcy5mLnMoKSkpfSxqZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5pYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5pYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTt0aGlzLmYuTGMmJnRoaXMuZi5MYygpP3RoaXMuZi5FZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LGtyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx0cTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249Yi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSwkYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRxKHRoaXMuaWIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQWUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkxjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9CmIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUuUGgodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy4kYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEFlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTsKZm9yKHZhciAkYT1jLnVqfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy4kcD10aGlzLmFbMV07dGhpcy5Cbz10aGlzLmFbNF07dGhpcy5NbD10aGlzLmFbNF07dGhpcy54bj10aGlzLmFbMV07dGhpcy5Ybj10aGlzLmFbNF07dGhpcy52dj0KdGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5pdz1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMub286dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRwOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cbzp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWw6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhuOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ybjp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudnY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5pd3x8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLm5vKDQpOyhmdW5jdGlvbihjKXtjLkRsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5CZChiKTt0aGlzLnBnKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKSl9LApwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxBYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkOwpiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGNiPWMuRGx8fGNiOyhmdW5jdGlvbihjKXtjLkNsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kYSgpO3RoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5UZj10aGlzLlZmPXRoaXMuV2c9dGhpcy5lYT10aGlzLnNmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuV2cmJnRoaXMuamcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmYS5hYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmJkKCk7dGhpcy5XZz0hMDt0aGlzLmpnKCl9LmJpbmQodGhpcykpO3RoaXMuZmcoKX0samc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5iZCgpO2lmKCF0aGlzLnNmJiYhdGhpcy5iZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuc2YmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LApLZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxmZzpmdW5jdGlvbigpe2lmKHRoaXMuYmQoKSl7dmFyIGI9dGhpcy5LZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9Yi5oeH10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LGx4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLnl4KCk6ITF9LENjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/CmIuQ2MoKTotMX0sTnE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLlNiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5EZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLk5xKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBkYj1jLkNsfHxkYjsoZnVuY3Rpb24oYyl7Yy5FbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFByOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlZsLkFuLnluP3dpbmRvdy5PTy5WbC5Bbi55bi5meChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnhlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYywKdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBlYj1jLkVsfHxlYixmYj1uZXcgZWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXA9dGhpcy5hWzhdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuYWo9dGhpcy5hWzFdO3RoaXMuZHI9dGhpcy5hWzRdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMuaHI9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzhdO3RoaXMucGs9dGhpcy5hWzNdO3RoaXMuR2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbN119Yy5GcD1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuJGkoYSl9LCRpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5hajp0aGlzLmNyKGEpfSxjcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhPwp0aGlzLmRyOnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kbjp0aGlzLmdyKGEpfSxncjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaHI6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnVyOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wazp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5GcHx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuRHAoNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk5nKCl9LApOZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy55aCgpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuZmp8fGhiOyhmdW5jdGlvbihjKXtjLmVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSwKdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmdnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2coYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuZWp8fGliOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCkJoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zcXx8KHRoaXMuc3E9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkJoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5CaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuZ2p8fGpiLFQ9bmV3IGpiKHIpO1QuZygpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xbD10aGlzLmFbOF07dGhpcy5zcj10aGlzLmFbNV07dGhpcy5JdT10aGlzLmFbMTBdO3RoaXMuY289dGhpcy5hWzldO3RoaXMuRnc9dGhpcy5hWzhdO3RoaXMuR209dGhpcy5hWzhdO3RoaXMuQ2o9dGhpcy5hWzhdO3RoaXMuam49dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMV19Yy50cD1iO2IucHJvdG90eXBlPXtwbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWw6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNyOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JdTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY286dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZ3OnRoaXMuRm0oYSl9LEZtOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuR206dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMudHB8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnBsKDQpOyhmdW5jdGlvbihjKXtjLnJtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ybXx8VTsoZnVuY3Rpb24oYyl7Yy5xbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIisKYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guVmMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5OcyhhKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5acSgpfSxOczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7CnJldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn19dGhpcy51KCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMucW18fFY7KGZ1bmN0aW9uKGMpe2Muc209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUuQnAoYix0aGlzLnVkKSk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMudWR8fCh0aGlzLnVkPVtdKSx0aGlzLnVkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSwKZnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5IY3x8KHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChiKSx0aGlzLmF1KCkmJih0aGlzLmJmKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LFpxOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGI9MDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPQowO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LmZ2KGIpfX0pfSkoYyk7dmFyIGxiPWMuc218fGxiLHg9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWo9dGhpcy5hWzhdO3RoaXMuU2k9dGhpcy5hWzJdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMuYnM9dGhpcy5hWzJdO3RoaXMuem89dGhpcy5hWzNdO3RoaXMuZXE9dGhpcy5hWzNdO3RoaXMuYW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNl19Yy5MbT1iO2IucHJvdG90eXBlPXt6ajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFqOnRoaXMuUmkoYSl9LApSaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU2k6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBvOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5iczp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem86dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVxOnRoaXMuJG4oYSl9LCRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1iPWMuTG18fG1iLE9jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLnpqKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7CnRoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LEFhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuYmp8fG5iOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLmNqfHxvYjsoZnVuY3Rpb24oYyl7Yy5kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTihnKXx8Cih0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLmRqfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzldO3RoaXMuQWs9dGhpcy5hWzldO3RoaXMuS2o9dGhpcy5hWzJdO3RoaXMuZnI9dGhpcy5hWzRdO3RoaXMuUWs9dGhpcy5hWzEwXTt0aGlzLndqPXRoaXMuYVs1XTt0aGlzLmlxPXRoaXMuYVs5XTt0aGlzLkN3PXRoaXMuYVszXTt0aGlzLkl0PXRoaXMuYVsxMF07dGhpcy5WcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX0KYy5Xbz1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ0OnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuS2o6dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZyOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Razp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2o6dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pcTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3c6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkl0OnRoaXMuVXAoYSl9LFVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5Xb3x8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuZXQoNCk7KGZ1bmN0aW9uKGMpe2MudWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuUHQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sUHQ6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiYKdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFhnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMudWx8fHNiOyhmdW5jdGlvbihjKXtjLnRsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5taT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5taSYmKHRoaXMuRygpLHRoaXMubWk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnRsfHx0YjsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBiPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy52bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLnhpPXRoaXMuYVsxXTt0aGlzLnZxPXRoaXMuYVszXTt0aGlzLndyPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuU3M9YjtiLnByb3RvdHlwZT17ZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVrOnRoaXMud2koYSl9LAp3aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGk6dGhpcy51cShhKX0sdXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZxOnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy53cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuU3N8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmRrKDQpOyhmdW5jdGlvbihjKXtjLlltPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7CnZhciB3Yj1jLlltfHx3YjsoZnVuY3Rpb24oYyl7Yy5YbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxYYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sTnQ6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy50Yz0KITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5OdCh0aGlzLkNhKToodGhpcy5DYT10aGlzLlhiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpO3JldHVybn1pZighdGhpcy50Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTsKZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLlhtfHx4YjsoZnVuY3Rpb24oYyl7Yy5abT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuWm18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudnA9dGhpcy5hWzVdO3RoaXMuUG09dGhpcy5hWzEwXTt0aGlzLnBzPXRoaXMuYVs2XTt0aGlzLmRsPXRoaXMuYVszXTt0aGlzLk1pPXRoaXMuYVsyXTt0aGlzLkNpPXRoaXMuYVs5XTt0aGlzLmFtPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVsyXTt0aGlzLnFvPXRoaXMuYVszXTt0aGlzLm9sPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuWnI9YjtiLnByb3RvdHlwZT17dXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZwOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QbTp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucHM6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NaTp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ2k6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5hbTp0aGlzLnptKGEpfSx6bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQW06dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFvOnRoaXMubmwoYSl9LG5sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuWnJ8fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLnVwKDQpOyhmdW5jdGlvbihjKXtjLmNtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5XZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucnQoKX0uYmluZCh0aGlzKSw1MDApfSxydDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLldlJiYKd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LE51OmZ1bmN0aW9uKCl7dGhpcy5XZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuY218fEJiOyhmdW5jdGlvbihjKXtjLmJtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ucz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMua2N8fCh0aGlzLmtjPQowLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5ucz8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuTnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLmJtfHxDYjsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuZG18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bj10aGlzLmFbM107dGhpcy5qbT10aGlzLmFbNl07CnRoaXMuU2s9dGhpcy5hWzNdO3RoaXMuQ3I9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5XbD1iO2IucHJvdG90eXBlPXt1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5pbShhKX0saW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmptOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tazp0aGlzLkJyKGEpfSxCcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLldsfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1TYy51big0KTsoZnVuY3Rpb24oYyl7Yy5ZbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5ZbHx8R2I7KGZ1bmN0aW9uKGMpe2MuWGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuS2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnBwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMubWQoKTsKMDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy4kcigpOnRoaXMuaWcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxwcDpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5tKCEwKX0sJHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7IWIucWEmJmIuWSYmYi5leCYmYi5neCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGlnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PQpiPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCl9LmJpbmQodGhpcyksMTAwKX0sbWQ6ZnVuY3Rpb24oKXtpZighdGhpcy50aClmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuS2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudGg9YltjXSk7cmV0dXJuIHRoaXMudGh9LHp4OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLm1kKCkuYWRzTG9hZGVyP3RoaXMuRyghMCk6dGhpcy5HKCk6dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBIYj1jLlhsfHxIYjsoZnVuY3Rpb24oYyl7Yy5abD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgSGIoYyx0aGlzLkkpKS5nKCkpfXJldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgSWI9Yy5abHx8SWIsSmI9bmV3IEliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBxPXRoaXMuYVsxMF07dGhpcy5xcj10aGlzLmFbN107dGhpcy5PbD10aGlzLmFbMTBdO3RoaXMuRXQ9dGhpcy5hWzhdOwp0aGlzLnR3PXRoaXMuYVsxMF07dGhpcy50dj10aGlzLmFbOF07dGhpcy5CbD10aGlzLmFbM107dGhpcy5saj10aGlzLmFbM107dGhpcy5ubT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLnhwPWI7Yi5wcm90b3R5cGU9e29xOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wcTp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXI6dGhpcy5ObChhKX0sTmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9sOnRoaXMuRHQoYSl9LER0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5FdDp0aGlzLnN3KGEpfSxzdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHc6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR2OnRoaXMuQWwoYSl9LEFsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CbDp0aGlzLmtqKGEpfSxrajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGo6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMubm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnhwfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5vcSg0KTsoZnVuY3Rpb24oYyl7Yy5Waz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7SCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlcoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LAp4eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Wa3x8WDsoZnVuY3Rpb24oYyl7Yy5Vaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhlPWIuaWQpO0g/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGUmJmIhPXRoaXMuWGV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmCiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkZ4KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy51KCJhZGVycm9yIiksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFk9Yy5Va3x8WTsoZnVuY3Rpb24oYyl7Yy5Xaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/CiExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWChiKSxiLm5hP3RoaXMuYmYoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEgsTGI9Yy5Xa3x8TGIsTWI9bmV3IExiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jaj10aGlzLmFbMTBdO3RoaXMuWmk9dGhpcy5hWzRdOwp0aGlzLmJxPXRoaXMuYVs2XTt0aGlzLmdsPXRoaXMuYVszXTt0aGlzLllxPXRoaXMuYVs4XTt0aGlzLm5qPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3M9YjtiLnByb3RvdHlwZT17SGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLklqOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5aaTp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnE6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmdsOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ZcTp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLktzfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuSGooNCk7KGZ1bmN0aW9uKGMpe2MuYWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSxhJiZjPyh0aGlzLlcoYyksdGhpcy5aKGEpKTp0aGlzLmNhKCkpOnRoaXMuY2EoKTp0aGlzLmNhKCk6dGhpcy5jYSgpfSxmdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LEN4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuYWt8fE9iOyhmdW5jdGlvbihjKXtjLiRqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpezEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IiwKZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMub2EoKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIFBiPWMuJGp8fFBiOyhmdW5jdGlvbihjKXtjLmJrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7Ynx8KGI9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYiYmYi5HZXRBbGxQbGF5ZXJzJiYoYj1iLkdldEFsbFBsYXllcnMoKSkmJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm5hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5ia3x8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5SbT10aGlzLmFbNF07dGhpcy55dT10aGlzLmFbNF07dGhpcy50cz10aGlzLmFbMl07dGhpcy55aj10aGlzLmFbM107dGhpcy5Fcz10aGlzLmFbOF07dGhpcy5IcD10aGlzLmFbM107dGhpcy5qcj10aGlzLmFbNl07dGhpcy54bz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsyXX1jLnRtPWI7Yi5wcm90b3R5cGU9e1FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5SbTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXU6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRzOnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55ajp0aGlzLkRzKGEpfSxEczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRXM6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhwOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuanI6dGhpcy53byhhKX0sd286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy50bXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuUW0oNCk7KGZ1bmN0aW9uKGMpe2MuZm49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuVyhhKX1lbHNlIHRoaXMuY2EoKX0sCkxkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxPdDpmdW5jdGlvbigpe3RoaXMuUmQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuUmQ9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX19LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLmZufHxUYjsoZnVuY3Rpb24oYyl7Yy5lbj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxTdDpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksCmIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSl9LGFkOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpOwphLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sTmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0wO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuYWQod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk5mLmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuU3Qod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5OZigpO3RoaXMuUnQoKX0sUnQ6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLAp0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oKXt9KX0sbTpmdW5jdGlvbihiKXt0aGlzLk10P3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbigpe3RoaXMuTXQ9ITB9fSl9KShjKTt2YXIgVWI9Yy5lbnx8VWI7KGZ1bmN0aW9uKGMpe2MuZ249dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5PdCgpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7CnZhciBWYj1jLmdufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLkFwPXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzZdfWMud209YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5tOnRoaXMuenAoYSl9LHpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5BcDp0aGlzLnFqKGEpfSxxajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLndtfHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy5NbSg0KTsKKGZ1bmN0aW9uKGMpe2MuSW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy53aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLkNzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxmdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLAphPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMud2gmJih0aGlzLndoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy5JbXx8TzsoZnVuY3Rpb24oYyl7Yy5IbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnJ1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKaGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLkhtfHxQOyhmdW5jdGlvbihjKXtjLkptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuYmYoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLkptfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9CnRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuY2s9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkd0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5ja3x8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnQoNCk7KGZ1bmN0aW9uKGMpe2MuTms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Naz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuYmgoKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnFiKCksITA7dGhpcy5UZysrO2lmKDEwPAp0aGlzLlRnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmguYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PQp0eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPwoodGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLk1rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Paz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsCnRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLk9rfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHY9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbN119Yy5rbD1iO2IucHJvdG90eXBlPXtrdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLmtsfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMua3YoNCk7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaGcoKX0sCmhnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5Xanx8ZWM7KGZ1bmN0aW9uKGMpe2MuWWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz0KbmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmx0PXRoaXMuYVs0XTt0aGlzLk1wPXRoaXMuYVsyXTt0aGlzLldzPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzVdfWMuVG09YjtiLnByb3RvdHlwZT17a3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmx0OnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NcDp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLldzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuVG18fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmt0KDQpOyhmdW5jdGlvbihjKXtjLnBpPQpwLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5waXx8aWM7KGZ1bmN0aW9uKGMpe2Mub2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMub2l8fGpjOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj0KbmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMucml8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56bD10aGlzLmFbN107dGhpcy56aT10aGlzLmFbOV07dGhpcy5ubj10aGlzLmFbMTBdO3RoaXMuQXU9dGhpcy5hWzFdO3RoaXMuWHA9dGhpcy5hWzFdO3RoaXMucW49CnRoaXMuYVsyXTt0aGlzLlFpPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbNV07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5XaT1iO2IucHJvdG90eXBlPXt5bDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpsOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56aTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubm46dGhpcy56dShhKX0senU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF1OnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5YcDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucW46dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFpOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Zczp0aGlzLnFrKGEpfSxxazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucms6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5XaXx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMueWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZWg9dGhpcy5naD10aGlzLmZoPSExO3RoaXMueGQ9W107dGhpcy5hZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYj8KbnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBFYj9udWxsOkViLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgemI/bnVsbDp6YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBsYz8KbnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuVGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5PcShhKTpbXSxiO3RoaXMuZ2g9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZmg9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuSGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmFmKXtpZih0aGlzLmVoKWJyZWFrO2I9dGhpcy5hZltjXTt0aGlzLnZmKGIpJiYodGhpcy54ZC5wdXNoKGIpLHRoaXMuSGgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxPcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSwKUHU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmZoKWZvcih0aGlzLmVoPSEwLGE9MDthPHRoaXMueGQubGVuZ3RoO2ErKyl0aGlzLnhkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGRbYV0uTGIpfX19KShjKTt2YXIgbmM9Yy5UbHx8bmMsTT1uZXcgbmM7TS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWW89dGhpcy5hWzldO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMucnc9dGhpcy5hWzFdO3RoaXMudm89dGhpcy5hWzEwXTt0aGlzLk12PXRoaXMuYVszXTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLlNvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzldfWMuS209YjtiLnByb3RvdHlwZT17WG86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLllvOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Obzp0aGlzLnF3KGEpfSwKcXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJ3OnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52bzp0aGlzLkx2KGEpfSxMdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk12OnRoaXMudXMoYSl9LHVzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52czp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYz1jLkttfHxvYyxhZD1uZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5Ybyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOgoiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQmMoay5FdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuQmMoay5JcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLApyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLllnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWWcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtJLmthKCk7dmFyIGNkPWJkKGZ1bmN0aW9uKCl7ZS55Zyh3aW5kb3csSS5FcigpLHtpZDpjZH0pfSw1MDApLGlhPWUuYWEoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenY9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMl19Yy5ibD1iO2IucHJvdG90eXBlPXt5djpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPWMuYmx8fHBjLGRkPW5ldyBwYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWRkLnl2KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy54aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMuc2Q9MDt0aGlzLmJiPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0saXU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxodTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oYSxiKXtlLmZhKCJ3ZWx0LmRlIikmJmUuYWIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5IcigpKXRoaXMubGIubCh0aGlzLmxiLm9kLHRoaXMubGIud2EsdGhpcy5sYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLkFjKTsKZWxzZSBpZih0aGlzLmFyKCkpdGhpcy5jdShmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudihrLnljLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3ICRhKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5SdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLm9iKCJuZXdIb21hZERpc3BsYXkiKTtSPWw9bmV3IFJhKGwsdGhpcy5sYixnKTtsLmd1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5tcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sCmcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuS2UoYSxjLGYpO3RoaXMucGxheWVyLkpoKGwpfX0sSHI6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxiPTA7aWYodGhpcy5zZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLnNkLmdldFRpbWUoKSx0aGlzLnNkPWEsM0U1PGI/ITA6ITE7dGhpcy5zZD1hO3JldHVybiExfSxFdTpmdW5jdGlvbigpe2Uub2IoInByZXJvbGwiKTtlLmZmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0sRHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7CmUub2IoInBvc3Ryb2xsIik7dGhpcy5udSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy51ZyhjKSk/dGhpcy5NYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxWdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnR1KHRoaXMuRHUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTsKaWYoIXRoaXMubWgpe3RoaXMubWg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuTWMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZGQsdGhpcy5wbGF5ZXIucygpKSl9fSxVdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLm11KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuRXUoKTt0aGlzLnBsYXllci5OZSYmdGhpcy5VdCgpO3RoaXMuVnQoKX0sV3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9CjA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMueWQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLkR3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy56ZD10aGlzLnlkLmxlbmd0aH0sYXI6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPHRoaXMuemQmJihhPSEwKTtyZXR1cm4gYX0sY3U6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLnh0LmJpbmQodGhpcykpfSx4dDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0sbXM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTsKcmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnNpfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFwPXRoaXMuYVsxXTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLlVzPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMuVGk9YjtiLnByb3RvdHlwZT17UHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFwOnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlRpfHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9ZWQuUHAoNCl9KS5jYWxsKGthZWNoYWVNQW9sYWVidVosa2FlY2hhZU1Bb2xhZWJ1Wik7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.47.137 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.137.47.251.148.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 07 Oct 2019 02:05:43 GMT
Last-Modified
Wed, 15 May 2019 14:42:46 GMT
Server
openresty/1.15.8.2
ETag
"5cdc2566-18"
Access-Control-Allow-Methods
GET
Content-Type
application/octet-stream
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame F033
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
04c7251dca0914d9d5f9c3984afde3b0d28aebb1fcd83d17fe4e758445a4c396

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
text/javascript
/
ssl.1.damoh.giga.de/42e212144286b64f6e565f27139aeaaa1bdb26ef/ Frame 92E8
109 B
671 B
XHR
General
Full URL
https://ssl.1.damoh.giga.de/42e212144286b64f6e565f27139aeaaa1bdb26ef/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGthZWNoYWVNQW9sYWVidVo9a2FlY2hhZU1Bb2xhZWJ1Wnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5pdShtKTthLmh1KGwpO2EuV3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5xdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzldfWMuRnU9YjtiLnByb3RvdHlwZT17Rm46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkduOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LcDp0aGlzLkRtKGEpfSxEbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRW06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYT1jLkZ1fHxoYSxzYz1uZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRm4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuTmM9W107dGhpcy5uZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnd0LmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5SZz17fTt0aGlzLmRmPSExfWMuaGs9YjtiLnByb3RvdHlwZT17UXU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrdGhpcy5uYltiXSsiXyIpO3JldHVybiBhfSxZYjpmdW5jdGlvbigpe3RoaXMuZGZ8fCh0aGlzLmRmPWUuYWEoMTApKTtyZXR1cm4gdGhpcy5kZn0sb2I6ZnVuY3Rpb24oYSl7dGhpcy5uYlthXXx8KHRoaXMubmJbYV09MCk7dGhpcy5uYlthXSs9MTs1PHRoaXMubmJbYV0mJiF0aGlzLlJnW2FdJiYodGhpcy5SZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIiwKdGhpcy5RdSgpLCEwKSl9LG5lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFVuOmZ1bmN0aW9uKGEpe3RoaXMuYmEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx3dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy52dChhLmRhdGEpfSwKdnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmJhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lciYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxnZTpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxvZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkdnKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5qaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sR2c6ZnVuY3Rpb24oYSl7dmFyIGI9Cm5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFNuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMuemEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS55cShhKSlyZXR1cm47KGI9dGhpcy5vZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09CmF9fSx5cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSx3ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUnI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0seGU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxGZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PQp0eXBlb2YgZD9kOm51bGx9LFBoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTsKdmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTtxPWcuaGVpZ2h0Kmcud2lkdGg7ZD1nLndpZHRoO2Y9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEZlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWUoYS5lbCwKYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihiKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LEhiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSx6ZTpmdW5jdGlvbihhKXt2YXIgYj0KMCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LEtoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixxLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLG09MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2gocSk7c3dpdGNoKG4lCjQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eT1rO3U9bTtyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHEsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSwKdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHEsNSkrKG4meXxuJnV8eSZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChxLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2U9ZStxJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O209bSt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihtKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksCmY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHE+PjYsZz1xJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihxKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sTnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSwKaGQ6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxxPSExLGM9ITEsZT0hMSxnPSExLGs9ITEsbT0hMSxsPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlRiPyEwOiExfWNhdGNoKHUpe310cnl7cT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwKLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPXE7YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LGxyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LAokbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sVGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxmbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEpvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWGkoKXx8YS5oaigpfHxhLmxyKCl8fGEuRmwoKXx8YS4kbSgpfHxhLlRrKCl8fGEuZm0oKX19O3JldHVybiBudWxsIT1hLkpvKCl9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscT1hLmxlbmd0aDtmPHE7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sWmI6ZnVuY3Rpb24oYSl7YT10aGlzLnphKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sUXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy56YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LEJwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LEd1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5jaShiKSsiOiIrdGhpcy5jaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sY2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGZmOmZ1bmN0aW9uKGEpe3RoaXMuQ2I9YX0seWc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5DYjt0aGlzLmNlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7CmEuZGlzcGF0Y2hFdmVudChmKX0sQmM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLnlnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHEsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3EmJihCPWsuVGEoQixxKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuQmMoQil9LHl0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmIuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuUXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxKdTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuWWIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmNlKGEpfSxjZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnl0KGEpO2lmKGIpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bS5KYygpO20ueWEoYSwhMCk7YT1tLnlhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO20uRGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uSmMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwptLnlhKGYsITApO2Y9bS55YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkRhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sS2Q6ZnVuY3Rpb24oYSl7aWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bS5KYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1tLnlhKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO20uRGEoYSl9fSxMZTpmdW5jdGlvbigpe20mJm0uVj9tLmlzRW5hYmxlZCYmbS5jcCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sY2c6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkdlKGEpfHx0aGlzLlJyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guY2YmJndpbmRvdy5zYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMud2coYSkpcmV0dXJuIHRoaXMud2coYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYWIoYSxiLkxhLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnFkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLlNuKGUsYSk7cmV0dXJuIGV9LGFiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIGw9ZXx8bTtlPSEwO2smJihlPSExKTtpZihsJiZsLlYpaWYobC5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtsLnlhKGEsZSk7ZT1sLnlhKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtlLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHIgaW4gZCllLmRhdGFbcl09ZFtyXTtyZXR1cm4gbC5EYShlLGYsYywiIiwiIixnKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYSxiLGQsZixjLGwsZyxrKX0uYmluZCh0aGlzKSw1MDApfSxqaDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fAo0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxrKSxsLndpdGhDcmVkZW50aWFscz1lLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKHIpe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuamgoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuTmMpZm9yKHZhciBjIGluIHRoaXMuTmMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5OY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueGIoYSk7ZCYmCihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sa2g6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihhLGYuTGEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLmZzKGYucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LApxdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5OYz1hfSxEdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOgpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sS286ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LExyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLmhrfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT0KYXx8e319Yy5naz1iO2IuVGE9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLmp0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkhzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuanE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlhmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlBmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLAptZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuVWY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuWWY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLkpuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLlNmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuSnY9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkdzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmtxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IucHc9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iua2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ycD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuZGQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi55Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuV2Y9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkxuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuVWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLiRkPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLmJlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5Lbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iuamk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Kcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnRkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnRmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07CmIubGc9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkZ2PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRXY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Jcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7CnZhciBrPWMuZ2t8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzEwXTt0aGlzLnRvPXRoaXMuYVszXTt0aGlzLldyPXRoaXMuYVs1XTt0aGlzLmJ0PXRoaXMuYVsxMF07dGhpcy5Ebz10aGlzLmFbM107dGhpcy5Qcz10aGlzLmFbMTBdO3RoaXMuSG89dGhpcy5hWzddO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMuR2k9dGhpcy5hWzJdO3RoaXMuS2k9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5ScD1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSW46dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnRvOnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xcjp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnQ6dGhpcy5DbyhhKX0sQ286ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuRG86dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBzOnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ibzp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS3c6dGhpcy5GaShhKX0sRmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5HaTp0aGlzLkppKGEpfSxKaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2k6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLlJwfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Ibig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmlrPWI7Yi5wcm90b3R5cGU9e3plOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09CmEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LExxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LApsZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubGQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxFcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxZZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnplKHRoaXMuTHEoKSsiIiksCmE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaWt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMuT2k9dGhpcy5hWzVdO3RoaXMuRWk9dGhpcy5hWzhdO3RoaXMubnE9dGhpcy5hWzEwXTt0aGlzLmhtPXRoaXMuYVs0XTt0aGlzLkhrPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuR3c9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1sOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53azp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhPwp0aGlzLk9pOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRWk6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ucTp0aGlzLmdtKGEpfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaG06dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5Hd3x8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MubGwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsCmY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLm9qPWJ9KShjKTt2YXIgTD1jLm9qfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNuPXRoaXMuYVs3XTsKdGhpcy5Vbz10aGlzLmFbMl07dGhpcy5DdT10aGlzLmFbOF07dGhpcy54cz10aGlzLmFbNF07dGhpcy5Fbj10aGlzLmFbNl07dGhpcy5Gbz10aGlzLmFbMl07dGhpcy5Kaz10aGlzLmFbN107dGhpcy5hbD10aGlzLmFbNF07dGhpcy5PcD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs5XX1jLnJvPWI7Yi5wcm90b3R5cGU9e0JuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVW86dGhpcy5CdShhKX0sQnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN1OnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54czp0aGlzLkRuKGEpfSxEbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRW46dGhpcy5FbyhhKX0sRW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkZvOnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLiRrKGEpfSwKJGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFsOnRoaXMuTnAoYSl9LE5wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5PcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucm98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLkJuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuU2w9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5NYT17fTt0aGlzLkk9bnVsbDt0aGlzLktjPTEwMDt0aGlzLkliPTA7dGhpcy5XYT0xNTA7dGhpcy5MYj0wO3RoaXMuanUoYil9LGc6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhPyh0aGlzLkliKyssdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLktjKSk6CjA+dGhpcy5XYSYmKHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5LYykpfSxhdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkliPnRoaXMuV2E/ITA6ITF9LGJmOmZ1bmN0aW9uKCl7dGhpcy5JYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sanU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LEpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuUCgpLCEwKTt0aGlzLk1hW2IubGEoKV09YjtNJiZNLmdoJiZNLlB1KGIpfSxyeDpmdW5jdGlvbigpe3JldHVybiBlLnhlKHRoaXMuTWEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX0sTXI6ZnVuY3Rpb24oYil7Yj1iLkthKCk7Zm9yKHZhciBhIGluIHRoaXMuTWEpaWYoYi5pZD09CnRoaXMuTWFbYV0uS2EoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sSng6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5TbHx8dDsoZnVuY3Rpb24oYyl7Yy5VbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLktjPTEwO3RoaXMuSWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubmE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkJiPSIiO3RoaXMucWc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5LYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxNOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30sCnR1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSxzeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LG11OmZ1bmN0aW9uKGIpe3RoaXMuT2U9Yn0scXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZX0sTmU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhJiYodGhpcy5JYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuS2MpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpOwplbHNlIHJldHVybiExfWNhdGNoKGIpe319LEVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2EoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuYnIoKXx8dGhpcy5ObigpO3RoaXMuQmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSx0eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxObjpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5hYSgxMCkpfSxicjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sVzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj0KYn0sS2E6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmF9LGNhOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMH0sTGM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxJZTpmdW5jdGlvbigpe3JldHVybiExfSxKaDpmdW5jdGlvbihiKXt0aGlzLkJiPWJ9LHB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmJ9LEVoOmZ1bmN0aW9uKCl7dGhpcy5CYj1udWxsfSx2eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuQmImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLnFnfHwodGhpcy5xZz0hMCl9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLlVsfHxwOyhmdW5jdGlvbihjKXtjLnRpPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5JPXRoaXMucGxheWVyPSIiO3RoaXMuTGY9IjEiO3RoaXMuTWY9IjIiO3RoaXMuem49IjMiO3RoaXMuUWM9MDt0aGlzLm5oPQozMDt0aGlzLlJiPVtdO3RoaXMuZ2I9W107dGhpcy5vYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5aZj10aGlzLmZpPSExO3RoaXMuc3RhdHVzPXRoaXMuUWM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLmdmKGIpO3RoaXMua3UoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5maXx8KHRoaXMuZmk9ITAsZS5MZSgpKX0sU2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxEcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5rYSgpXXx8KHdpbmRvd1thLmthKCldPXt9KTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldfHwod2luZG93W2Eua2EoKV1bYi5sYSgpXT17fSx3aW5kb3dbYS5rYSgpXVtiLmxhKCldLmluaXRpYXRvcj0KZS5ZYigpKTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWWIoKV0/d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldKys6d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldPTF9LEpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLmhmKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMueGEoKSl7dGhpcy5EcigpO2lmKCF0aGlzLkpyKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmhmKCk7cmV0dXJufXRoaXMuaGYoKTt0aGlzLkkodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLlpoKCk7dGhpcy5aZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSx1OmZ1bmN0aW9uKGIsCmEpe3RoaXMueGEoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmdiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxaaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuZ2Ipe2Zvcih2YXIgaD0wO2g8dGhpcy5nYi5sZW5ndGg7aCsrKXRoaXMub2NbdGhpcy5nYltoXS5yZWFzb25dPT10aGlzLm9jW2JdJiZhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLHRoaXMub2NbdGhpcy5nYltoXS5yZWFzb25dPHRoaXMub2NbYl0mJihhPVtdLGEucHVzaCh0aGlzLmdiW2hdLmRldGFpbCksYj10aGlzLmdiW2hdLnJlYXNvbik7dGhpcy5vY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITAsYSl9fSx1eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlpmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZn0saGY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxydTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuem59LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5RY30sUmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTGZ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk1mfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5RY30sZ2Y6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxrdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxqczpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMudGl8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR0PXRoaXMuYVsyXTt0aGlzLiRzPXRoaXMuYVsxMF07dGhpcy55dz10aGlzLmFbN107dGhpcy5pbD10aGlzLmFbNl07dGhpcy5Naj10aGlzLmFbN107dGhpcy5Maz10aGlzLmFbMV07dGhpcy5mbz10aGlzLmFbNV07dGhpcy5ncT10aGlzLmFbOV07dGhpcy5tcD10aGlzLmFbOV07dGhpcy5udD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs5XX1jLm1rPWI7Yi5wcm90b3R5cGU9e2N0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kdDp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy54dyhhKX0seHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnl3OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pbDp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5LayhhKX0sS2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5Mazp0aGlzLmVvKGEpfSxlbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZm86dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdxOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5tcDp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLm1rfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5jdCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87CnRoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Uanx8b2E7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLmR4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7CmIuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuVWp8fHBhOyhmdW5jdGlvbihjKXtjLlZqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Wanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmJuPXRoaXMuYVsxXTt0aGlzLm5yPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuQXQ9YjtiLnByb3RvdHlwZT17dW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZtOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLmJuOnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubnI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkF0fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy51bSg0KTsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5xcD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5iYz0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5XKGIpfSwKeGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KSwKYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJgozMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyOwphLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Da3x8c2E7KGZ1bmN0aW9uKGMpe2MuQms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYKKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ29tcGxldGUiKTsKdGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnFwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTt0aGlzLlNlKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMudygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJnRoaXMuVGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy53KCksdGhpcy5yYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sanM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8odGhpcy5yZT50aGlzLnNlJiYoYj0hMSksdGhpcy5HKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSw1MCk6KGEudmcoKSxhLnhnKCksYS5iY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ca3x8dGE7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5HcSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLk1yKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sb3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sR3E6ZnVuY3Rpb24oKXt2YXIgYj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB1YT1jLkRrfHx1YSx2YT1uZXcgdWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFqPXRoaXMuYVsxXTt0aGlzLlR2PXRoaXMuYVs0XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5sbT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLmpsPWI7Yi5wcm90b3R5cGU9e1BqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Rajp0aGlzLlN2KGEpfSxTdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHY6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJzOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMuamx8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlBqKDQpOwooZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0KITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHhhPWMuVm18fHhhOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLkNhPXRoaXMuWGM9ITE7dGhpcy5BaD1lLkhiKDEwKTt0aGlzLmVpPSEwO3RoaXMudGM9dGhpcy5WZz0hMTt0aGlzLkZzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5xaCgpLHRoaXMuWm8oKSx0aGlzLnFiKCkpfSxGczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmNvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLAoiOyIsYi5KP2IuSi5xYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaGU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5oZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkFoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJgoodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxYYjpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSWc6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSwKS3I6ZnVuY3Rpb24oKXtpZighdGhpcy5VZyl7dmFyIGI9dGhpcy55YigpLGE9dGhpcy5JcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVWc9ITApfXJldHVybiB0aGlzLlVnfSxJcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuWGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlhjPSEwKTtyZXR1cm4gdGhpcy5YY30scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLlR0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sVHQ6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuSWcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudWM9ITA7aWYoZS5mYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLnVjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxueDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMubmcmJmIuYWRzJiYodGhpcy5uZz1iLmFkcyk7cmV0dXJuIHRoaXMubmd9LFpvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdhKCEwKTt0aGlzLnUoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5TZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPQohMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLklnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0scWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuS3IoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpOwp0aGlzLnliKCl9ZWxzZSB0aGlzLlZnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpLGI9dGhpcy5YYigpO2EmJiFiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZ2EoKSk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlZnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPQphLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LCRvOmZ1bmN0aW9uKCl7dGhpcy56Y3x8KHRoaXMuemM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnpjIT0KYi5hZHMuc3RhdGUmJih0aGlzLnpjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuemM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRvKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpezA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5laT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5HKHRoaXMuZWksZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGhwOmZ1bmN0aW9uKCl7dGhpcy53eHx8KDEwPHRoaXMuVXY/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5VdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLiR0KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhwKCl9LmJpbmQodGhpcyksNTApKSl9LCR0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlZ2KXt0aGlzLlZ2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciB5YT1jLlVtfHx5YTsoZnVuY3Rpb24oYyl7Yy5XbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5RaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUWgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS54ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwKKG5ldyB5YShhLHRoaXMuSSkpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxUOmZ1bmN0aW9uKCl7dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLktjKX19KX0pKGMpO3ZhciB6YT1jLldtfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGw9dGhpcy5hWzEwXTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm5rPWI7Yi5wcm90b3R5cGU9e0dsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5IbDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLm5rfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuR2woNCk7KGZ1bmN0aW9uKGMpe2MuSmw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5VZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7CmQmJmEmJmEuYWMmJigwPD1oLmluZGV4T2YoZCl8fGEud2QoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlVlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlVlKys7aWYoMTA8dGhpcy5VZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuSmx8fENhOyhmdW5jdGlvbihjKXtjLklsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8Cih0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudGU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5xcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLnFxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucXQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuSWx8fERhOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLktsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXc9dGhpcy5hWzVdO3RoaXMuanY9dGhpcy5hWzNdO3RoaXMuc249dGhpcy5hWzFdO3RoaXMuenM9dGhpcy5hWzddO3RoaXMubW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy5BaT1iO2IucHJvdG90eXBlPXtIdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXc6dGhpcy5pdihhKX0saXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmp2OnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zbjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenM6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9CmMuQWl8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLkh3KDQpOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkZnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMudXQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy51dCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxncDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCkllOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy50a3x8SGE7KGZ1bmN0aW9uKGMpe2Muc2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMuc2t8fElhOyhmdW5jdGlvbihjKXtjLnVrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLnVrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRms9dGhpcy5hWzhdO3RoaXMudHQ9dGhpcy5hWzhdO3RoaXMuT2o9dGhpcy5hWzNdO3RoaXMuUWw9dGhpcy5hWzVdO3RoaXMuR3I9dGhpcy5hWzJdO3RoaXMubHM9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5Saj1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRms6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnR0OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Pajp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWw6dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdyOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMubHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYT1jLlJqfHxMYSxEYz1uZXcgTGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuams9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sbHU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxQbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmprfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmgsZCxmKXt0aGlzLmZiPWE7dGhpcy5BZz10aGlzLm5pPSExO3RoaXMucmg9ZDt0aGlzLlJoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLmZiPW5ldyB6KGEpKTt2YXIgYz10aGlzLnNiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkhlKHRoaXMuZmIudXJsKSYmbS5NZCl7dmFyIGU9bmV3IHooYS51cmwpO2UubHUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uaWEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5raz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5mYi5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5BZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuUmg/dGhpcy5zYi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCExKTp0aGlzLnNiLm9wZW4odGhpcy5mYi5tZXRob2QsdGhpcy5mYi51cmwsITApLHRoaXMubml8fCh0aGlzLnNiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5zYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuc2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuc2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkhlKHRoaXMuZmIudXJsKT9tLk1kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSGUodGhpcy5mYi51cmwpLHRoaXMucmgmJnRoaXMucmgoKX1yZXR1cm4gdGhpcy5zYn19fSkoYyk7dmFyIE1hPWMua2t8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLlZkPSExfWMucGo9YjtiLnByb3RvdHlwZT17cHU6ZnVuY3Rpb24oYSl7dGhpcy5WZD1hfSxvdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LFl0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e053OiJBZENsaWNrVGhydSIsUHc6IkFkRXJyb3IiLFF3OiJBZFN0b3BwZWQiLFR3OiJBZExpbmVhckNoYW5nZSIsVXc6IkFkVGFnUGFyc2VkIixYdzoiQWRWaWRlb0NvbXBsZXRlIiwkdzoiQWRMb2FkZWQiLGF4OiJBZFNraXBwZWQiLGJ4OiJBZFN0YXJ0ZWQiLFJ3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsU3c6IkFkSW1wcmVzc2lvbiIsT3c6IkFkQ3JlYXRpdmVWaWV3IixWdzoiQWRWaWRlb01pZHBvaW50IixXdzoiQWRQYXVzZWQiLFl3OiJBZFZpZGVvU3RhcnQiLFp3OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuVmQsYltkXSl9LFh0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVWQpZm9yKHZhciBiIGluIHRoaXMuSGEuVWQpdGhpcy5IYS5VZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVWRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuVmQmJnRoaXMuWXQoKTt0aGlzLkhhJiZ0aGlzLlh0KCl9fX0pKGMpO3ZhciBOYT1jLnBqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmllPQp0aGlzLnZjPXRoaXMud2I9bnVsbDt0aGlzLkNwPXRoaXMuSmI9dGhpcy5paD0hMTt0aGlzLkxhPSIiO3RoaXMuZGg9ITE7dGhpcy53YT10aGlzLm9kPSIiO3RoaXMuWmc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuJGU9ITE7dGhpcy5wYT1bXTt0aGlzLk9nPXRoaXMuZmM9IiI7dGhpcy5xZT0hMTt0aGlzLnFmPTA7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuSWQ9W107dGhpcy5nYz0iIjt0aGlzLnJmPTA7dGhpcy52aWRlb3BsYXphPQp7fTt0aGlzLkRjPSExO3RoaXMuaXA9dGhpcy5PZD1udWxsO3RoaXMuTGg9dGhpcy5sYz10aGlzLnNnPXRoaXMudWY9dGhpcy5NZD10aGlzLmtlPXRoaXMuUmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5wZD0wO3RoaXMuUWc9ITE7dGhpcy5QZz0xRTM7dGhpcy5aYz0hMTt0aGlzLlFhPTFFMzt0aGlzLk9mPSIifWMubGs9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy53YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLnZjLGFkdGFncmVnZXg6dGhpcy5pZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5paCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5DcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmRoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLndhLAppc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuWmcsc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZmMsaG9tYWRBZHBhdGg6dGhpcy5PZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnFmLEhPTUFEX1ZFUklGSUVEOnRoaXMuR2YsSE9NQURfQkxPQ0tFRDp0aGlzLkVmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm5jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5GZix0ZXN0SGlkZTp0aGlzLmhjLHRlc3RUYWdzOnRoaXMuaWMsdGVzdFRhZ3NKUzp0aGlzLmpjLHRlc3RUYWdzWEhSOnRoaXMuSWQsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMucmYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmlwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUmMsCmJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5rZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5NZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy51Zixjb25maWdGYWlsdXJlczp0aGlzLmhiLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLkloLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5qYix2cGFpZDp0aGlzLmxjLHNraXBBbGxvd2VkOnRoaXMuTGgsdm1hcHM6dGhpcy5raSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuWmMsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sJHE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmKGE9ITApO3JldHVybiBhfSxlZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSxIcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2JdJiYxPT10aGlzLmhiW2JdJiZhLnB1c2goYik7CnJldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLktvKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuR2UoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuRmMoKT9lPWE6ZT1jLnByb3RvY29sKwoiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLkpjKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMud2N8fHRoaXMud2J8fHRoaXMudmN8fHRoaXMuaWUpJiYoZz10aGlzLnJzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuSXEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxHZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT8KYj0hMDp0aGlzLkZjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxGYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5HZShhKTtyZXR1cm4gYn0sSXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PQp0eXBlb2YgdGhpcy5MYSYmMDx0aGlzLkxhLmxlbmd0aClyZXR1cm4gdGhpcy5MYTtmb3IoZCBpbiB0aGlzLkxhKWlmKGI9dGhpcy5MYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLml4O3JldHVybiJub25lIn0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLkloXX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnFkKCksYj10aGlzLktoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LG9oOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LHFzOmZ1bmN0aW9uKGEsCmIpe3ZhciBkPWUuemEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLm9oKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5vaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LHJzOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJgooYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy52YyYmKGE9dGhpcy5xcyhhLHRoaXMudmMpKTtyZXR1cm4gYX0sZnA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuYXAodGhpcy5GYS5jbGllbnRBUElzKX0sYXA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLnB1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5vdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5kaD0hMDt0aGlzLm9kPWE7dGhpcy53YT1iO3RoaXMuJGU9ZDt0aGlzLk9kPWY7dGhpcy5BYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5mcCgpO3RoaXMuZXMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5jcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLndhKXRyeXt0aGlzLndhPWIsdGhpcy54YygpfWNhdGNoKGspe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9fSxwYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sZXM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMub2QrdGhpcy5mZSgiZ2xvYmFsIikpLHRoaXMuV3EuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sY3M6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5mZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sZmU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2Upe3RoaXMua2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQWM9ITEpO3RoaXMuQWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5BYz90aGlzLkFjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5aZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuRWYpKTt0aGlzLk5iKCk7ZS5CYyhrLmp0KTsoYj1lLlpiKHRoaXMucWQoKSkpfHwoYj1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxXcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZmN8fHRoaXMuTGF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8Cm51bGw7dGhpcy5PZz1hLmFkcGF0aHx8IiI7dGhpcy5xZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkloPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZmMmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuR2MoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEdjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuSmMoKSksZD10aGlzLnphKHRoaXMuZmMpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPQoiUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuZmMrdGhpcy5mZSgiY3VzdG9tZXIiKSk7dGhpcy5EYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImN1c3RvbWVyIik7YT90aGlzLmVtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZW09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxTdTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkRjPSEwO3RoaXMuR2MoITApO3JldHVybn19dGhpcy5NZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuc2c9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmpiPQp0aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaGM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5qYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy53Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnZjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5pZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5paD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmxjPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5sYzt0aGlzLkxoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuJGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmtpPWIudm1hcHN8fCIiO3RoaXMuWmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8CjFFMzt0aGlzLk9mPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmdjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuUHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnFlJiYodGhpcy5nYz1udWxsKTt0aGlzLnJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkRjPSEwLHRoaXMuR2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMubXYoKSYmKHRoaXMuaGN8fHRoaXMuamN8fHRoaXMuaWN8fHRoaXMuZ2N8fHRoaXMuSWQpP3RoaXMuJGU/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSksdGhpcy5tZSgpLHRoaXMuTmIoKSk6dGhpcy5ZdSgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlp1KCkpfX0sWXU6ZnVuY3Rpb24oKXt0aGlzLlh1KCk7CnRoaXMuJHUoKX0sJHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsCiIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9CmQpe3ZhciBjPWUuaGQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxadTpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpO3RoaXMuTmIoKX0sT2M6ZnVuY3Rpb24oYSl7dGhpcy5SYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIoYSkpLHRoaXMuTmIoKSx0aGlzLm1lKCkpfSxYdTpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmhoKCkpdGhpcy5PYyh0aGlzLm5jLAoibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5WaCgpfX1lbHNlIHRoaXMuVmgoKX0sVWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLkhiKCkpO3RoaXMuY3YoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm5mLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuaWM9dGhpcy5JZCkmJnRoaXMuaWMubGVuZ3RoKXt2YXIgZD10aGlzLmljLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubmYoKX0sY3Y6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGMsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5VaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5qYyYmdGhpcy5qYy5sZW5ndGgpe3ZhciBkPXRoaXMuamMuc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5VaCgpfSxkdjpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nYz8odGhpcy5xZisrLHRoaXMuRGEobmV3IHoodGhpcy5nYyksdGhpcy5XdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5vZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlNoKCl9LG9mOmZ1bmN0aW9uKGEpe3RoaXMuT2ModGhpcy5GZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LFd1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnFmP3RoaXMubmYoKTp0aGlzLm9mKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuU2goKTp0aGlzLm9mKCJBQUEiKX0sU2g6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5tZSgpfSxoaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUmMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaGgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5PZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk9kJiZ0aGlzLk9kKCl9LGVwOmZ1bmN0aW9uKCl7aWYodGhpcy51ZiYmdGhpcy4kcSgpKXt2YXIgYT10aGlzLkhxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxaaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnBkfHwodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlBnJiYhdGhpcy5RZyYmKHRoaXMuUWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlBnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5uaT0hMCk7cSYmZS5OcigpJiYoYS5BZz0hMCk7ZyYmKGEuUmg9ITApO3JldHVybiBhLmxvYWQoKX0sYnA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxWdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMua2l9LGNwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMuSXYuYmluZCh0aGlzKSx0aGlzLkh2LmJpbmQodGhpcykpfSxJdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMubHEoKX0sSHY6ZnVuY3Rpb24oKXt9LApscTpmdW5jdGlvbigpe2UuQmMoay5rcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYWIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxtdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnJmfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmxrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucG09dGhpcy5hWzFdO3RoaXMuQ209dGhpcy5hWzJdO3RoaXMueGw9dGhpcy5hWzRdO3RoaXMuQ3Q9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMl19Yy5aaj1iO2IucHJvdG90eXBlPXtvbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucG06dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNtOnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueGw6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMuWmp8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLm9tKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmJiPWEuZi5QKCk6dGhpcy5iYj0iIjthLmYuWGcmJmEuZi5YZyh7cGF1c2U6dGhpcy53ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkdoLmJpbmQodGhpcyksbXV0ZTp0aGlzLlBlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuQXYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5pYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlZiPXRoaXMuWWM9ITE7dGhpcy5Jbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkZkPXt9O2Uub2IoIm5ld0JpZ0FkSWQiKTt0aGlzLkxvPWUuYWEoMTApO3RoaXMubGY9MDt0aGlzLldjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuV2M9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYKKGE9dGhpcy5iLmYucygpKSx0aGlzLldjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlZuPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuc2g9dGhpcy5FZD0hMTt0aGlzLmxoPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5lZT0hMTt0aGlzLmJpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYWM9ITE7dGhpcy5zcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5NaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5QZD10aGlzLk9iPXRoaXMub2U9dGhpcy5lZD10aGlzLkdkPXRoaXMucmI9dGhpcy5tYz10aGlzLnVoPXRoaXMua2Q9dGhpcy5udj10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5yYz1bXTt0aGlzLmNjPXt9O3RoaXMuZ3Q9MjAwO3RoaXMuQmY9CnRoaXMuQ2Y9dGhpcy5qZT10aGlzLkFmPXRoaXMuWmU9ITE7dGhpcy52ZD17fX1jLmZrPWI7Yi5wcm90b3R5cGU9e2d1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGJ9LCRoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkNiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5MdSgpO2UudihrLkxuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEtlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5sZisrLGUub2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5lcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJgp0aGlzLkwuaXNFbmFibGVkPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmxjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuJGgoKSxuZXcgUyh0aGlzLGEsdGhpcy5saCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5sYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7CmVsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLktlKGEsYixjKX0sNTApfX0sVmU6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5rZD0hMTt0aGlzLmM9YTt0aGlzLnV1KHRoaXMuYyk7dGhpcy52ZD1uZXcgUWEodGhpcy5jLkt2LHRoaXMudmlkZW8se30pO3RoaXMuTGcoYSk7dGhpcy5yYz10aGlzLkNnKGEpO3RoaXMubnAoKX0sTGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuRmQ9dGhpcy5TcShhKSksdGhpcy5MZyhhLnBhcmVudCkpfSxDZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuQ2coYS5wYXJlbnQpKSxjLnB1c2godGhpcy5DcShhKSkpO3JldHVybiBjfSwKQ3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LFNxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8CmYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5rYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZ2QmJmEuZ2QuZXJyb3ImJmEuZ2QuZXJyb3IuY29kZSYmKGI9YS5nZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlBjLmNvZGU6Yj09Ry5XZC5jb2RlP2UudihrLmh3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpOihlLkxlKCksYj09Ry5KZi5jb2RlJiZlLnYoay5Hcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5qcSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuTXUoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmUudihrLkp2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLnYoay5wdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUudihrLnd3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5Icyx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsuRnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsuR3YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuV2IoYSk7dGhpcy5SYSgpfSxXYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLkplKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSx1dTpmdW5jdGlvbihhKXt0aGlzLm9lPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTsKdGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5aZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLkl4PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7CnRoaXMuVm4mJnRoaXMucGxheWVyLnVlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci51ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuUW4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLlplJiZiLmxvYWQoKTtpZih0aGlzLldoKGIpKXt0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt0aGlzLlRuKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5aZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz0KdGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLm9wKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5zdSgpKTp0aGlzLmMub3JpZ2luLnRnKHcuVGQpfSxzdTpmdW5jdGlvbigpe3RoaXMuQWY9ITA7dGhpcy5yYj10aGlzLm1jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnJiPSEwKTtlLm5lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlVuKHRoaXMuYy5vcmlnaW4udmEpOwp0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnZoKCk7dGhpcy5iLmpmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5qZigpO3RoaXMudGE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmdpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuVnEoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuY2coImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmdlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuR2QmJnRoaXMuYi5mLkFhKCkmJmUudihrLnljLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi4kYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5yYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuWHYoKSx0aGlzLmIuJGIoITApLCF0aGlzLk9iKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsCmNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLiRiKCEwKSx0aGlzLmV3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN3KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR3KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZncoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuYncoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubGkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9CmEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlViKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmtnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5aYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuYmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT0KYS5kYXRhLm5hbWUmJih0aGlzLkNmJiYodGhpcy5CZj0hMSx0aGlzLmVjKCkpLHRoaXMuWnYoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnJiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpOwplLmdlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuZ2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuJGYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubWM9ITB9LFp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSk7dGhpcy5tYz0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLk9oKCk7ZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sZXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sY3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5rZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSl9LGR3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxidzpmdW5jdGlvbigpe3RoaXMud2YoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxsaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm5lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSwKV3Y6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmd3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5saSghMCl9LFFuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5GYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5Sdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LApXaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sVG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxBZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5oaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxoaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMueWYoYSl9LmJpbmQodGhpcyksdGhpcy5JbykpfSx5ZjpmdW5jdGlvbihhKXtpZighdGhpcy5ZYyYmdGhpcy5XaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLlZiKXt0aGlzLlljPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5BZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnNnfHwKdGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuT3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5qZigpO3RoaXMuTnYoKTt0aGlzLmdpKCk7dGhpcy5kZygpO3RoaXMuYi52aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5tZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLmVkfHx0aGlzLlFmKCl9LFFmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZWR8fChhP3RoaXMuUmEoKToodGhpcy5QZSghMCksdGhpcy5RZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0uYmluZCh0aGlzKTt0aGlzLndlKCkuSmgodGhpcyl9LHdmOmZ1bmN0aW9uKCl7dGhpcy5MLmpiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkpuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxNbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkdnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuSnUoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlFkJiZ0aGlzLk1uKHRoaXMuYy5RZCk7CmlmKCF0aGlzLm9lKWlmKHRoaXMub2U9ITAsdGhpcy5QZHx8KGUudihrLkpzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucGMpe2Uub2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMubGYrKzt0aGlzLlZiPXRoaXMuWWM9ITE7dHJ5e3RoaXMuQWQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkVkPSExO3RyeXt0aGlzLmIuZGkoKX1jYXRjaChnKXt9dGhpcy5HZD0hMDt0aGlzLmIuQWUoKTt0aGlzLmFjPSExO3RoaXMud2UoKS5FaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5RZSgpO3RoaXMuYy5wYyYmKGE/dGhpcy5jLm9yaWdpbi5waCgpOnRoaXMucGUoKSl9ZWxzZSB0aGlzLnBlKCl9LApSdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMueGYoYSkpfSx4ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5icCgpO3RoaXMuYy5vcmlnaW4udGcody5UZCl9LGlpOmZ1bmN0aW9uKCl7aWYodGhpcy5udil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5HZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsueWMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnJ2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlBkPSEwO2UudihrLmppLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkZlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmtmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1oKSkmJihjPXRoaXMuYy5rZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuRWR8fCh0aGlzLkVkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLldmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLlZiPXRoaXMuWWM9ITEsdGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkVkPSExLHRoaXMuYi5kaSgpLHRoaXMuYy5vcmlnaW4uUWUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5XYy5yZXBsYWNlKCJbdGltZV0iLGUuQmcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5lZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGFpOmZ1bmN0aW9uKCl7dGhpcy51aHx8KHRoaXMudWg9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2UudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5iaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmFpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5haSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLk9oKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwuamImJgp0aGlzLllhKCJzdGFydCIpLGUudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlBmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKgp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmJpPWEpfSxOaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sTHU6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LE9oOmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxNdTpmdW5jdGlvbigpe2UuS2QoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLktkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5BZnx8dGhpcy5MLmpiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmpiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMudmQmJnRoaXMudmQudHJhY2smJnRoaXMudmQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuVHEodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5qZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkZkLmltcHJlc3Npb25zJiYKZS5McihnLnVybCx0aGlzLkZkLmltcHJlc3Npb25zKT90aGlzLkplKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Lbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5GZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSmUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnlwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5BZiYmKGI9Il92cGFpZCIpO3RoaXMuQ2YmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sSmU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5QbihjKSxmfHwKKGY9dGhpcy5yZyksZXx8KGU9dGhpcy5yZyksdGhpcy5SbihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LERoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LG5wOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sT3U6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuY2NbYl0mJmErKztyZXR1cm4gYX0sVHE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx5cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLlB2LmJpbmQodGhpcykpfSxQdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sTnY6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuV2MucmVwbGFjZSgiW3RpbWVdIixlLkJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuJGMmJihiPXRoaXMuTC4kYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLAoxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZ2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnNwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLApmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlhoLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06CihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnF2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucHYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgoobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuTWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5rZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwKKHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksCmMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlBlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQmZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx3ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sR2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0scHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LHF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5yYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnJiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5yYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxQZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm1mKCkpfSxwZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmplJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnNofHwhdGhpcy5MLlJjJiYic3BpZWdlbC5kZSIhPWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5lZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm1nKCkpOih0aGlzLnNoPXRoaXMuQ2Y9dGhpcy5CZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmplPSEwLGE9ZS5jZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5LZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbWc6ZnVuY3Rpb24oYSl7dGhpcy5PdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoITApfS5iaW5kKHRoaXMpLHRoaXMuZ3QpOih0aGlzLkdkPSEwLHRoaXMuYi5BZSgpLHRoaXMuYi5idSgpLHRoaXMuYWM9ITEsCmUudihrLnJwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy53ZSgpLkVoKCkpfSx3ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkVlKHRoaXMudmlkZW8sYSk/dGhpcy5HaCgpOnRoaXMud2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5VYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnJjJiYwPHRoaXMucmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnJjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5MbysiLSIrdGhpcy5sZjt0aGlzLmMmJnRoaXMuYy5IZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSGcoKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ma3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGo9dGhpcy5hWzVdO3RoaXMua289dGhpcy5hWzJdO3RoaXMuUnM9dGhpcy5hWzhdO3RoaXMubHc9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy50bj1iO2IucHJvdG90eXBlPXtzajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGo6dGhpcy5qbyhhKX0sam86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmtvOgp0aGlzLlFzKGEpfSxRczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnM6dGhpcy5rdyhhKX0sa3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmx3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy50bnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuc2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLmhzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLlNtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmhkKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5EYShiLHRoaXMuZ3MuYmluZCh0aGlzKSx0aGlzLmRzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5RcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5WdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxRcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuTHQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9CnRoaXMuRGcoKTt0aGlzLnNjPXRoaXMucGYoKTt0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEucmVzcG9uc2VVUkw7dGhpcy5ZLmxlbmd0aD90aGlzLkljKCk6dGhpcy5zYSh0aGlzLlNhKHcuUGMse2Vycm9yOnRoaXMuemY/Ry5XZDpHLklmfSkpfSxoczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpO3RoaXMucWM9dGhpcy5UaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sZHM6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5IZix7ZGVwdGg6YX0pKX0sSWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5TcigpP3RoaXMuZXYoKT8oYSsrLApuZXcgYih0aGlzLHRoaXMuTWcoKSxoLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMuc2EodGhpcy5TYSh3LktmKSk6KGE9MCx0aGlzLkR2KCkmJnRoaXMuVmUodGhpcy53cCgpKSl9LFFlOmZ1bmN0aW9uKCl7dGhpcy5zYz8odGhpcy5zYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5RZSgpfSxwaDpmdW5jdGlvbigpe3RoaXMucWM/KHRoaXMucWM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQucGgoKX0sRHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idigpP3RoaXMuYXYoKT8hMDooLTEhPXRoaXMuQ2MoKT90aGlzLnNhKHRoaXMuU2Eody5TZCkpOnRoaXMuc2EodGhpcy5TYSh3LkRmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5QYyxHLkpmKSksITEpfSxWZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5RZHx8KGEuUWQ9CltdKTthLlFkLnB1c2godGhpcy5TZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk1lKCkpO2EudGI9YS50Yj9hLnRiOnRoaXMuc2M7YS5wYz1hLnBjP2EucGM6dGhpcy5xYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5wYXJlbnQuVmUoYSl9LHdwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuQ2MoKTthLk89dGhpcy5KZygpO2EuVWI9dGhpcy5EcSgpO2EuS3Y9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5BcSgpO2Eua2Y9dGhpcy5ScShhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLnpnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT13LlNkLmNvZGU/Yi5QYS5jb25jYXQodGhpcy5FcSgpKTpiLlBhLmNvbmNhdCh0aGlzLk1xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuV2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sZXY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxidjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuSmcoKS5sZW5ndGh9LAphdjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQ2MoKX0scGY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxUaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucGYoKSYmKGE9ITApO3JldHVybiBhfSxMdDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk1nKCkubGVuZ3RofSxNZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwKIlZBU1RBZFRhZ1VSSSIpfSxCcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwiQWRTeXN0ZW0iKX0sTWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy4kZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LCRnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuJGcoYS5wYXJlbnROb2RlKToKITF9LE1xOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxEcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxKZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSwKang6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsCmM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMubmQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LENjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxScTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd1KGQsYSksMD5iJiYKKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLlNtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllrPXRoaXMuYVszXTt0aGlzLk1zPQp0aGlzLmFbN107dGhpcy5rcD10aGlzLmFbMTBdO3RoaXMuWm49dGhpcy5hWzddO3RoaXMucHQ9dGhpcy5hWzVdO3RoaXMuVXU9dGhpcy5hWzhdO3RoaXMueHY9dGhpcy5hWzEwXTt0aGlzLnlrPXRoaXMuYVs3XTt0aGlzLmh2PXRoaXMuYVs4XTt0aGlzLnZpPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuWXA9YjtiLnByb3RvdHlwZT17WGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zazp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTXM6dGhpcy5qcChhKX0sanA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtwOnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abjp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucHQ6dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV1OnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy54djoKdGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlrOnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5odjp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLllwfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Yayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlViPSIiO3RoaXMuQj10aGlzLnBjPXRoaXMudGI9ITE7dGhpcy5CZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuQ2U9IiJ9Yy5SbD1iO2IucHJvdG90eXBlPXtvcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSwKYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxLcTpmdW5jdGlvbigpe2lmKCF0aGlzLkJlJiYKdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkdhKXt2YXIgYT10aGlzLm9yaWdpbi5HYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkJlPWFbY10pfXJldHVybiB0aGlzLkJlfSxIZzpmdW5jdGlvbigpe2lmKHRoaXMuQ2UpcmV0dXJuIHRoaXMuQ2U7dmFyIGE9IiI7KGE9dGhpcy5LcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuQ2U9YX0sVnE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLlJsfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuaW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMV19Yy5pdD1iO2IucHJvdG90eXBlPXtobzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLml0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5obyg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LERmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxQYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCk9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEx3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSWk9dGhpcy5hWzldO3RoaXMuQXc9dGhpcy5hWzEwXTt0aGlzLnlyPXRoaXMuYVsyXTt0aGlzLkFyPXRoaXMuYVsxXTt0aGlzLnZ3PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuSXA9YjtiLnByb3RvdHlwZT17SGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklpOnRoaXMuencoYSl9LHp3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bdzp0aGlzLnhyKGEpfSx4cjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXI6dGhpcy56cihhKX0senI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Bcjp0aGlzLnV3KGEpfSx1dzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLklwfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5IaSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmdkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuU2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlNqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zcj10aGlzLmFbMTBdO3RoaXMuVmk9dGhpcy5hWzFdO3RoaXMubG49dGhpcy5hWzRdO3RoaXMueHE9CnRoaXMuYVszXTt0aGlzLlVyPXRoaXMuYVs0XTt0aGlzLkN2PXRoaXMuYVsxXTt0aGlzLmpqPXRoaXMuYVs4XTt0aGlzLnltPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuenQ9YjtiLnByb3RvdHlwZT17WHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLllyOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5WaTp0aGlzLmtuKGEpfSxrbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubG46dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhxOnRoaXMuVHIoYSl9LFRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vcjp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy55bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLnp0fHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5Ycig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuRmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5OZD1bXTt0aGlzLkNoPVtdO3RoaXMuUmU9W107dGhpcy5Rdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMuWms9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5GaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZoW2FdLApjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLkV4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlp0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLlF0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz0KYztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuTmQucHVzaCh7c3JjOmMsZnJhbWU6ZyxodDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5SZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlJlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy5GcShhKSl9fSxGcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntOeDohMCxNeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntBeDoidmlkZW8iLFB4OiJqc0N1c3RvbSIsUXg6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxSeDoxLApreDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LFVxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5OZC5sZW5ndGg7YisrKWlmKHRoaXMuTmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5OZFtiXS5odDtyZXR1cm4iIn0sWnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkNoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlVxKGIpLHZlbmRvcjpifSk7dGhpcy5LdSgpfSxRdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuUXYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSwKYil9LmJpbmQodGhpcykpOnRoaXMuYWcoYSxiKX0sYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLlJlLnB1c2goe3R5cGU6YSxWbzpiLEt4OiExfSl9LEt1OmZ1bmN0aW9uKCl7dGhpcy5DaC5tYXAoZnVuY3Rpb24oYSl7YS5Pcnx8KGEuRHgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLk94LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Pcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5aa3x8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXU9dGhpcy5hWzldO3RoaXMub3c9dGhpcy5hWzhdO3RoaXMud3U9dGhpcy5hWzldO3RoaXMuc2w9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5vcj1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmV1OnRoaXMubncoYSl9LG53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vdzp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud3U6dGhpcy5ybChhKX0scmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnNsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5vcnx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuZHUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5pYj1hLkVnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmJnPSExO3RoaXMuVGI9W119Yy51aj1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnpxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5rcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDsKZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUnU6ZnVuY3Rpb24oKXt0aGlzLmJnPSEwfSxkaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5mLnMoKSl9LGJ1OmZ1bmN0aW9uKCl7dGhpcy5iZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZGQsdGhpcy5mLnMoKSkpfSxqZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5pYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5pYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTt0aGlzLmYuTGMmJnRoaXMuZi5MYygpP3RoaXMuZi5FZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LGtyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx0cTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249Yi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSwkYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRxKHRoaXMuaWIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQWUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkxjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9CmIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUuUGgodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy4kYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEFlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTsKZm9yKHZhciAkYT1jLnVqfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy4kcD10aGlzLmFbMV07dGhpcy5Cbz10aGlzLmFbNF07dGhpcy5NbD10aGlzLmFbNF07dGhpcy54bj10aGlzLmFbMV07dGhpcy5Ybj10aGlzLmFbNF07dGhpcy52dj0KdGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5pdz1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMub286dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRwOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cbzp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWw6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhuOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ybjp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudnY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5pd3x8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLm5vKDQpOyhmdW5jdGlvbihjKXtjLkRsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5CZChiKTt0aGlzLnBnKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKSl9LApwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxBYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkOwpiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGNiPWMuRGx8fGNiOyhmdW5jdGlvbihjKXtjLkNsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kYSgpO3RoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5UZj10aGlzLlZmPXRoaXMuV2c9dGhpcy5lYT10aGlzLnNmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuV2cmJnRoaXMuamcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmYS5hYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmJkKCk7dGhpcy5XZz0hMDt0aGlzLmpnKCl9LmJpbmQodGhpcykpO3RoaXMuZmcoKX0samc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5iZCgpO2lmKCF0aGlzLnNmJiYhdGhpcy5iZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuc2YmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LApLZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxmZzpmdW5jdGlvbigpe2lmKHRoaXMuYmQoKSl7dmFyIGI9dGhpcy5LZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9Yi5oeH10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LGx4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLnl4KCk6ITF9LENjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/CmIuQ2MoKTotMX0sTnE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLlNiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5EZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLk5xKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBkYj1jLkNsfHxkYjsoZnVuY3Rpb24oYyl7Yy5FbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFByOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlZsLkFuLnluP3dpbmRvdy5PTy5WbC5Bbi55bi5meChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnhlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYywKdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBlYj1jLkVsfHxlYixmYj1uZXcgZWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXA9dGhpcy5hWzhdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuYWo9dGhpcy5hWzFdO3RoaXMuZHI9dGhpcy5hWzRdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMuaHI9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzhdO3RoaXMucGs9dGhpcy5hWzNdO3RoaXMuR2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbN119Yy5GcD1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuJGkoYSl9LCRpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5hajp0aGlzLmNyKGEpfSxjcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhPwp0aGlzLmRyOnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kbjp0aGlzLmdyKGEpfSxncjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaHI6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnVyOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wazp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5GcHx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuRHAoNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk5nKCl9LApOZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy55aCgpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuZmp8fGhiOyhmdW5jdGlvbihjKXtjLmVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSwKdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmdnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2coYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuZWp8fGliOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCkJoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zcXx8KHRoaXMuc3E9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkJoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5CaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuZ2p8fGpiLFQ9bmV3IGpiKHIpO1QuZygpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xbD10aGlzLmFbOF07dGhpcy5zcj10aGlzLmFbNV07dGhpcy5JdT10aGlzLmFbMTBdO3RoaXMuY289dGhpcy5hWzldO3RoaXMuRnc9dGhpcy5hWzhdO3RoaXMuR209dGhpcy5hWzhdO3RoaXMuQ2o9dGhpcy5hWzhdO3RoaXMuam49dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMV19Yy50cD1iO2IucHJvdG90eXBlPXtwbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWw6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNyOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JdTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY286dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZ3OnRoaXMuRm0oYSl9LEZtOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuR206dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMudHB8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnBsKDQpOyhmdW5jdGlvbihjKXtjLnJtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ybXx8VTsoZnVuY3Rpb24oYyl7Yy5xbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIisKYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guVmMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5OcyhhKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5acSgpfSxOczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7CnJldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn19dGhpcy51KCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMucW18fFY7KGZ1bmN0aW9uKGMpe2Muc209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUuQnAoYix0aGlzLnVkKSk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMudWR8fCh0aGlzLnVkPVtdKSx0aGlzLnVkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSwKZnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5IY3x8KHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChiKSx0aGlzLmF1KCkmJih0aGlzLmJmKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LFpxOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGI9MDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPQowO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LmZ2KGIpfX0pfSkoYyk7dmFyIGxiPWMuc218fGxiLHg9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWo9dGhpcy5hWzhdO3RoaXMuU2k9dGhpcy5hWzJdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMuYnM9dGhpcy5hWzJdO3RoaXMuem89dGhpcy5hWzNdO3RoaXMuZXE9dGhpcy5hWzNdO3RoaXMuYW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNl19Yy5MbT1iO2IucHJvdG90eXBlPXt6ajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFqOnRoaXMuUmkoYSl9LApSaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU2k6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBvOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5iczp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem86dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVxOnRoaXMuJG4oYSl9LCRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1iPWMuTG18fG1iLE9jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLnpqKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7CnRoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LEFhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuYmp8fG5iOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLmNqfHxvYjsoZnVuY3Rpb24oYyl7Yy5kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTihnKXx8Cih0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLmRqfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzldO3RoaXMuQWs9dGhpcy5hWzldO3RoaXMuS2o9dGhpcy5hWzJdO3RoaXMuZnI9dGhpcy5hWzRdO3RoaXMuUWs9dGhpcy5hWzEwXTt0aGlzLndqPXRoaXMuYVs1XTt0aGlzLmlxPXRoaXMuYVs5XTt0aGlzLkN3PXRoaXMuYVszXTt0aGlzLkl0PXRoaXMuYVsxMF07dGhpcy5WcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX0KYy5Xbz1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ0OnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuS2o6dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZyOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Razp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2o6dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pcTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3c6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkl0OnRoaXMuVXAoYSl9LFVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5Xb3x8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuZXQoNCk7KGZ1bmN0aW9uKGMpe2MudWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuUHQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sUHQ6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiYKdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFhnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMudWx8fHNiOyhmdW5jdGlvbihjKXtjLnRsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5taT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5taSYmKHRoaXMuRygpLHRoaXMubWk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnRsfHx0YjsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBiPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy52bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLnhpPXRoaXMuYVsxXTt0aGlzLnZxPXRoaXMuYVszXTt0aGlzLndyPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuU3M9YjtiLnByb3RvdHlwZT17ZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVrOnRoaXMud2koYSl9LAp3aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGk6dGhpcy51cShhKX0sdXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZxOnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy53cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuU3N8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmRrKDQpOyhmdW5jdGlvbihjKXtjLlltPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7CnZhciB3Yj1jLlltfHx3YjsoZnVuY3Rpb24oYyl7Yy5YbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxYYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sTnQ6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy50Yz0KITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5OdCh0aGlzLkNhKToodGhpcy5DYT10aGlzLlhiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpO3JldHVybn1pZighdGhpcy50Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTsKZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLlhtfHx4YjsoZnVuY3Rpb24oYyl7Yy5abT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuWm18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudnA9dGhpcy5hWzVdO3RoaXMuUG09dGhpcy5hWzEwXTt0aGlzLnBzPXRoaXMuYVs2XTt0aGlzLmRsPXRoaXMuYVszXTt0aGlzLk1pPXRoaXMuYVsyXTt0aGlzLkNpPXRoaXMuYVs5XTt0aGlzLmFtPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVsyXTt0aGlzLnFvPXRoaXMuYVszXTt0aGlzLm9sPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuWnI9YjtiLnByb3RvdHlwZT17dXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZwOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QbTp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucHM6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NaTp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ2k6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5hbTp0aGlzLnptKGEpfSx6bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQW06dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFvOnRoaXMubmwoYSl9LG5sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuWnJ8fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLnVwKDQpOyhmdW5jdGlvbihjKXtjLmNtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5XZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucnQoKX0uYmluZCh0aGlzKSw1MDApfSxydDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLldlJiYKd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LE51OmZ1bmN0aW9uKCl7dGhpcy5XZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuY218fEJiOyhmdW5jdGlvbihjKXtjLmJtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ucz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMua2N8fCh0aGlzLmtjPQowLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5ucz8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuTnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLmJtfHxDYjsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuZG18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bj10aGlzLmFbM107dGhpcy5qbT10aGlzLmFbNl07CnRoaXMuU2s9dGhpcy5hWzNdO3RoaXMuQ3I9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5XbD1iO2IucHJvdG90eXBlPXt1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5pbShhKX0saW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmptOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tazp0aGlzLkJyKGEpfSxCcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLldsfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1TYy51big0KTsoZnVuY3Rpb24oYyl7Yy5ZbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5ZbHx8R2I7KGZ1bmN0aW9uKGMpe2MuWGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuS2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnBwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMubWQoKTsKMDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy4kcigpOnRoaXMuaWcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxwcDpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5tKCEwKX0sJHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7IWIucWEmJmIuWSYmYi5leCYmYi5neCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGlnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PQpiPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCl9LmJpbmQodGhpcyksMTAwKX0sbWQ6ZnVuY3Rpb24oKXtpZighdGhpcy50aClmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuS2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudGg9YltjXSk7cmV0dXJuIHRoaXMudGh9LHp4OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLm1kKCkuYWRzTG9hZGVyP3RoaXMuRyghMCk6dGhpcy5HKCk6dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBIYj1jLlhsfHxIYjsoZnVuY3Rpb24oYyl7Yy5abD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgSGIoYyx0aGlzLkkpKS5nKCkpfXJldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgSWI9Yy5abHx8SWIsSmI9bmV3IEliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBxPXRoaXMuYVsxMF07dGhpcy5xcj10aGlzLmFbN107dGhpcy5PbD10aGlzLmFbMTBdO3RoaXMuRXQ9dGhpcy5hWzhdOwp0aGlzLnR3PXRoaXMuYVsxMF07dGhpcy50dj10aGlzLmFbOF07dGhpcy5CbD10aGlzLmFbM107dGhpcy5saj10aGlzLmFbM107dGhpcy5ubT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLnhwPWI7Yi5wcm90b3R5cGU9e29xOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wcTp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXI6dGhpcy5ObChhKX0sTmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9sOnRoaXMuRHQoYSl9LER0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5FdDp0aGlzLnN3KGEpfSxzdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHc6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR2OnRoaXMuQWwoYSl9LEFsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CbDp0aGlzLmtqKGEpfSxrajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGo6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMubm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnhwfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5vcSg0KTsoZnVuY3Rpb24oYyl7Yy5Waz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7SCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlcoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LAp4eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Wa3x8WDsoZnVuY3Rpb24oYyl7Yy5Vaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhlPWIuaWQpO0g/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGUmJmIhPXRoaXMuWGV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmCiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkZ4KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy51KCJhZGVycm9yIiksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFk9Yy5Va3x8WTsoZnVuY3Rpb24oYyl7Yy5Xaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/CiExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWChiKSxiLm5hP3RoaXMuYmYoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEgsTGI9Yy5Xa3x8TGIsTWI9bmV3IExiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jaj10aGlzLmFbMTBdO3RoaXMuWmk9dGhpcy5hWzRdOwp0aGlzLmJxPXRoaXMuYVs2XTt0aGlzLmdsPXRoaXMuYVszXTt0aGlzLllxPXRoaXMuYVs4XTt0aGlzLm5qPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3M9YjtiLnByb3RvdHlwZT17SGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLklqOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5aaTp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnE6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmdsOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ZcTp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLktzfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuSGooNCk7KGZ1bmN0aW9uKGMpe2MuYWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSxhJiZjPyh0aGlzLlcoYyksdGhpcy5aKGEpKTp0aGlzLmNhKCkpOnRoaXMuY2EoKTp0aGlzLmNhKCk6dGhpcy5jYSgpfSxmdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LEN4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuYWt8fE9iOyhmdW5jdGlvbihjKXtjLiRqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpezEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IiwKZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMub2EoKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIFBiPWMuJGp8fFBiOyhmdW5jdGlvbihjKXtjLmJrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7Ynx8KGI9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYiYmYi5HZXRBbGxQbGF5ZXJzJiYoYj1iLkdldEFsbFBsYXllcnMoKSkmJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm5hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5ia3x8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5SbT10aGlzLmFbNF07dGhpcy55dT10aGlzLmFbNF07dGhpcy50cz10aGlzLmFbMl07dGhpcy55aj10aGlzLmFbM107dGhpcy5Fcz10aGlzLmFbOF07dGhpcy5IcD10aGlzLmFbM107dGhpcy5qcj10aGlzLmFbNl07dGhpcy54bz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsyXX1jLnRtPWI7Yi5wcm90b3R5cGU9e1FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5SbTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXU6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRzOnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55ajp0aGlzLkRzKGEpfSxEczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRXM6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhwOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuanI6dGhpcy53byhhKX0sd286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy50bXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuUW0oNCk7KGZ1bmN0aW9uKGMpe2MuZm49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuVyhhKX1lbHNlIHRoaXMuY2EoKX0sCkxkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxPdDpmdW5jdGlvbigpe3RoaXMuUmQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuUmQ9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX19LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLmZufHxUYjsoZnVuY3Rpb24oYyl7Yy5lbj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxTdDpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksCmIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSl9LGFkOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpOwphLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sTmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0wO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuYWQod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk5mLmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuU3Qod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5OZigpO3RoaXMuUnQoKX0sUnQ6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLAp0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oKXt9KX0sbTpmdW5jdGlvbihiKXt0aGlzLk10P3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbigpe3RoaXMuTXQ9ITB9fSl9KShjKTt2YXIgVWI9Yy5lbnx8VWI7KGZ1bmN0aW9uKGMpe2MuZ249dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5PdCgpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7CnZhciBWYj1jLmdufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLkFwPXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzZdfWMud209YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5tOnRoaXMuenAoYSl9LHpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5BcDp0aGlzLnFqKGEpfSxxajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLndtfHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy5NbSg0KTsKKGZ1bmN0aW9uKGMpe2MuSW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy53aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLkNzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxmdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLAphPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMud2gmJih0aGlzLndoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy5JbXx8TzsoZnVuY3Rpb24oYyl7Yy5IbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnJ1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKaGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLkhtfHxQOyhmdW5jdGlvbihjKXtjLkptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuYmYoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLkptfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9CnRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuY2s9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkd0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5ja3x8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnQoNCk7KGZ1bmN0aW9uKGMpe2MuTms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Naz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuYmgoKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnFiKCksITA7dGhpcy5UZysrO2lmKDEwPAp0aGlzLlRnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmguYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PQp0eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPwoodGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLk1rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Paz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsCnRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLk9rfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHY9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbN119Yy5rbD1iO2IucHJvdG90eXBlPXtrdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLmtsfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMua3YoNCk7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaGcoKX0sCmhnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5Xanx8ZWM7KGZ1bmN0aW9uKGMpe2MuWWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz0KbmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmx0PXRoaXMuYVs0XTt0aGlzLk1wPXRoaXMuYVsyXTt0aGlzLldzPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzVdfWMuVG09YjtiLnByb3RvdHlwZT17a3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmx0OnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NcDp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLldzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuVG18fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmt0KDQpOyhmdW5jdGlvbihjKXtjLnBpPQpwLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5waXx8aWM7KGZ1bmN0aW9uKGMpe2Mub2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMub2l8fGpjOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj0KbmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMucml8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56bD10aGlzLmFbN107dGhpcy56aT10aGlzLmFbOV07dGhpcy5ubj10aGlzLmFbMTBdO3RoaXMuQXU9dGhpcy5hWzFdO3RoaXMuWHA9dGhpcy5hWzFdO3RoaXMucW49CnRoaXMuYVsyXTt0aGlzLlFpPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbNV07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5XaT1iO2IucHJvdG90eXBlPXt5bDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpsOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56aTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubm46dGhpcy56dShhKX0senU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF1OnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5YcDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucW46dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFpOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Zczp0aGlzLnFrKGEpfSxxazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucms6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5XaXx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMueWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZWg9dGhpcy5naD10aGlzLmZoPSExO3RoaXMueGQ9W107dGhpcy5hZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYj8KbnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBFYj9udWxsOkViLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgemI/bnVsbDp6YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBsYz8KbnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuVGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5PcShhKTpbXSxiO3RoaXMuZ2g9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZmg9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuSGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmFmKXtpZih0aGlzLmVoKWJyZWFrO2I9dGhpcy5hZltjXTt0aGlzLnZmKGIpJiYodGhpcy54ZC5wdXNoKGIpLHRoaXMuSGgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxPcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSwKUHU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmZoKWZvcih0aGlzLmVoPSEwLGE9MDthPHRoaXMueGQubGVuZ3RoO2ErKyl0aGlzLnhkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGRbYV0uTGIpfX19KShjKTt2YXIgbmM9Yy5UbHx8bmMsTT1uZXcgbmM7TS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWW89dGhpcy5hWzldO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMucnc9dGhpcy5hWzFdO3RoaXMudm89dGhpcy5hWzEwXTt0aGlzLk12PXRoaXMuYVszXTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLlNvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzldfWMuS209YjtiLnByb3RvdHlwZT17WG86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLllvOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Obzp0aGlzLnF3KGEpfSwKcXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJ3OnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52bzp0aGlzLkx2KGEpfSxMdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk12OnRoaXMudXMoYSl9LHVzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52czp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYz1jLkttfHxvYyxhZD1uZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5Ybyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOgoiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQmMoay5FdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuQmMoay5JcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLApyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLllnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWWcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtJLmthKCk7dmFyIGNkPWJkKGZ1bmN0aW9uKCl7ZS55Zyh3aW5kb3csSS5FcigpLHtpZDpjZH0pfSw1MDApLGlhPWUuYWEoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenY9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMl19Yy5ibD1iO2IucHJvdG90eXBlPXt5djpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPWMuYmx8fHBjLGRkPW5ldyBwYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWRkLnl2KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy54aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMuc2Q9MDt0aGlzLmJiPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0saXU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxodTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oYSxiKXtlLmZhKCJ3ZWx0LmRlIikmJmUuYWIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5IcigpKXRoaXMubGIubCh0aGlzLmxiLm9kLHRoaXMubGIud2EsdGhpcy5sYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLkFjKTsKZWxzZSBpZih0aGlzLmFyKCkpdGhpcy5jdShmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudihrLnljLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3ICRhKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5SdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLm9iKCJuZXdIb21hZERpc3BsYXkiKTtSPWw9bmV3IFJhKGwsdGhpcy5sYixnKTtsLmd1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5tcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sCmcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuS2UoYSxjLGYpO3RoaXMucGxheWVyLkpoKGwpfX0sSHI6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxiPTA7aWYodGhpcy5zZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLnNkLmdldFRpbWUoKSx0aGlzLnNkPWEsM0U1PGI/ITA6ITE7dGhpcy5zZD1hO3JldHVybiExfSxFdTpmdW5jdGlvbigpe2Uub2IoInByZXJvbGwiKTtlLmZmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0sRHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7CmUub2IoInBvc3Ryb2xsIik7dGhpcy5udSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy51ZyhjKSk/dGhpcy5NYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxWdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnR1KHRoaXMuRHUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTsKaWYoIXRoaXMubWgpe3RoaXMubWg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuTWMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZGQsdGhpcy5wbGF5ZXIucygpKSl9fSxVdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLm11KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuRXUoKTt0aGlzLnBsYXllci5OZSYmdGhpcy5VdCgpO3RoaXMuVnQoKX0sV3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9CjA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMueWQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLkR3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy56ZD10aGlzLnlkLmxlbmd0aH0sYXI6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPHRoaXMuemQmJihhPSEwKTtyZXR1cm4gYX0sY3U6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLnh0LmJpbmQodGhpcykpfSx4dDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0sbXM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTsKcmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnNpfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFwPXRoaXMuYVsxXTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLlVzPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMuVGk9YjtiLnByb3RvdHlwZT17UHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFwOnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlRpfHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9ZWQuUHAoNCl9KS5jYWxsKGthZWNoYWVNQW9sYWVidVosa2FlY2hhZU1Bb2xhZWJ1Wik7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.47.137 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.137.47.251.148.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Mon, 07 Oct 2019 02:05:43 GMT
Server
TornadoServer/5.0
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
109
/
ssl.1.damoh.giga.de/549673b44f1fb939febb4591236f3c1f6dfe97db/ Frame 92E8
42 B
738 B
XHR
General
Full URL
https://ssl.1.damoh.giga.de/549673b44f1fb939febb4591236f3c1f6dfe97db/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGthZWNoYWVNQW9sYWVidVo9a2FlY2hhZU1Bb2xhZWJ1Wnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5pdShtKTthLmh1KGwpO2EuV3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5xdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzldfWMuRnU9YjtiLnByb3RvdHlwZT17Rm46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkduOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LcDp0aGlzLkRtKGEpfSxEbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRW06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYT1jLkZ1fHxoYSxzYz1uZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRm4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuTmM9W107dGhpcy5uZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnd0LmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5SZz17fTt0aGlzLmRmPSExfWMuaGs9YjtiLnByb3RvdHlwZT17UXU6ZnVuY3Rpb24oKXt2YXIgYT0iIixiO2ZvcihiIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGErPWIrdGhpcy5uYltiXSsiXyIpO3JldHVybiBhfSxZYjpmdW5jdGlvbigpe3RoaXMuZGZ8fCh0aGlzLmRmPWUuYWEoMTApKTtyZXR1cm4gdGhpcy5kZn0sb2I6ZnVuY3Rpb24oYSl7dGhpcy5uYlthXXx8KHRoaXMubmJbYV09MCk7dGhpcy5uYlthXSs9MTs1PHRoaXMubmJbYV0mJiF0aGlzLlJnW2FdJiYodGhpcy5SZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIiwKdGhpcy5RdSgpLCEwKSl9LG5lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFVuOmZ1bmN0aW9uKGEpe3RoaXMuYmEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx3dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy52dChhLmRhdGEpfSwKdnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmJhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lciYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxnZTpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxvZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkdnKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5qaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sR2c6ZnVuY3Rpb24oYSl7dmFyIGI9Cm5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFNuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMuemEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS55cShhKSlyZXR1cm47KGI9dGhpcy5vZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYmEudXJsc1thXT1iO3RoaXMuYmEudXJsc1tiXT1hO3RoaXMuYmEuaG9tYWRVcmxzW2FdPWI7dGhpcy5iYS5vcmlnaW5hbFVybHNbYl09CmF9fSx5cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSx3ZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJscyYmdGhpcy5iYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYmEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sUnI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0seGU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxGZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PQp0eXBlb2YgZD9kOm51bGx9LFBoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxxPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTsKdmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTtxPWcuaGVpZ2h0Kmcud2lkdGg7ZD1nLndpZHRoO2Y9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LEZlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWUoYS5lbCwKYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihiKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LEhiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSx6ZTpmdW5jdGlvbihhKXt2YXIgYj0KMCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LEtoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixxLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLG09MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxuLHksdSxyLHQ7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2gocSk7c3dpdGNoKG4lCjQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3E9ZTtuPWc7eT1rO3U9bTtyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHEsNSkrKG4meXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSwKdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHEsNSkrKG4meXxuJnV8eSZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChxLDUpKyhuXnledSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2U9ZStxJjQyOTQ5NjcyOTU7Zz1nK24mNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1O209bSt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihtKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLHEsYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksCmY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHE+PjYsZz1xJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihxKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sTnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSwKaGQ6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxxPSExLGM9ITEsZT0hMSxnPSExLGs9ITEsbT0hMSxsPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlRiPyEwOiExfWNhdGNoKHUpe310cnl7cT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwKLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPXE7YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LFZhOmZ1bmN0aW9uKCl7dmFyIGE9e1hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGhqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LGxyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LAokbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sVGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxmbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEpvOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWGkoKXx8YS5oaigpfHxhLmxyKCl8fGEuRmwoKXx8YS4kbSgpfHxhLlRrKCl8fGEuZm0oKX19O3JldHVybiBudWxsIT1hLkpvKCl9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAscT1hLmxlbmd0aDtmPHE7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0sWmI6ZnVuY3Rpb24oYSl7YT10aGlzLnphKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sUXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYj13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYT13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYj13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy56YShkb2N1bWVudC5yZWZlcnJlciksYT1kLmhvc3QsYj1kLnBhdGgpfXJldHVybiBhK2J9LEJwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10scT0wO3E8Yi5sZW5ndGg7cSsrKWRbYltxXV09ITA7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErKylkW2FbcV1dfHxmLnB1c2goYVtxXSk7cmV0dXJuIGZ9LEd1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LEJnOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5jaShiKSsiOiIrdGhpcy5jaShNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sY2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LGZmOmZ1bmN0aW9uKGEpe3RoaXMuQ2I9YX0seWc6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5DYjt0aGlzLmNlKGQpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7CmEuZGlzcGF0Y2hFdmVudChmKX0sQmM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLnlnKGQsYixhKX0sdjpmdW5jdGlvbihhLGIsZCxmLHEsYyxnKXt2YXIgQj1hO2QmJmImJihiPWsuVGEoYixkKSk7YiYmKEI9ay5UYShhLGIpKTtmJiYoQj1rLlRhKEIsZikpO3EmJihCPWsuVGEoQixxKSk7YyYmKEI9ay5UYShCLGMpKTtnJiYoQj1rLlRhKEIsYykpO2UuQmMoQil9LHl0OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrKWI9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7aWEmJihiLnNlc3Npb25faWQ9aWEpO2IuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihiLmFkX2lkPWEuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmIuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuUXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpiLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpiLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGIudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBifSxKdTpmdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuWWIoKTthLmV2ZW50X2NvZGV8fChhLmV2ZW50X2NvZGU9OTk5MDApO2EuY29kZT1hLmV2ZW50X2NvZGU7YS5ldmVudF9uYW1lfHwoYS5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmNlKGEpfSxjZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnl0KGEpO2lmKGIpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNlKGIpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bS5KYygpO20ueWEoYSwhMCk7YT1tLnlhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO20uRGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uSmMoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpOwptLnlhKGYsITApO2Y9bS55YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkRhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sS2Q6ZnVuY3Rpb24oYSl7aWYoIW18fCFtLlYpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxiLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe3ZhciBiPWEuam9pbigiLCIpO2E9bS5KYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYik7YT1tLnlhKGEsITApO2EuZGF0YS5ob21hZF90cmFjaz1iO20uRGEoYSl9fSxMZTpmdW5jdGlvbigpe20mJm0uVj9tLmlzRW5hYmxlZCYmbS5jcCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7CmImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sY2c6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkdlKGEpfHx0aGlzLlJyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guY2YmJndpbmRvdy5zYW5kYm94LmNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMud2coYSkpcmV0dXJuIHRoaXMud2coYSk7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Yy5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtjLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYoYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGU9ITE7ZD0hMTtkPXRoaXMuYWIoYSxiLkxhLGMsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1kKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goZyl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLnFkKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLlNuKGUsYSk7cmV0dXJuIGV9LGFiOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcsayl7dmFyIGw9ZXx8bTtlPSEwO2smJihlPSExKTtpZihsJiZsLlYpaWYobC5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtsLnlhKGEsZSk7ZT1sLnlhKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtlLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHIgaW4gZCllLmRhdGFbcl09ZFtyXTtyZXR1cm4gbC5EYShlLGYsYywiIiwiIixnKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYSxiLGQsZixjLGwsZyxrKX0uYmluZCh0aGlzKSw1MDApfSxqaDpmdW5jdGlvbihhLGIsZCxmLGMsZSxnKXt2YXIgaz0hMDtnJiYoaz0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtnPWQ7ZD0iIjtmb3IodmFyIG0gaW4gZylkKz0iJiIrbSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGdbbV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fAo0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxrKSxsLndpdGhDcmVkZW50aWFscz1lLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKHIpe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuamgoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuTmMpZm9yKHZhciBjIGluIHRoaXMuTmMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5OY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueGIoYSk7ZCYmCihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sa2g6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihhLGYuTGEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLmZzKGYucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LApxdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5OYz1hfSxEdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOgpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sS286ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LExyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfX19KShjKTt2YXIgUT1jLmhrfHxRO25ldyBRO3ZhciBlPW5ldyBROyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT0KYXx8e319Yy5naz1iO2IuVGE9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLmp0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkhzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuanE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlhmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLlBmPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLAptZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuVWY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuWWY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLkpuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLlNmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuSnY9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkdzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmtxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IucHc9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iua2c9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ycD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuZGQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi55Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuV2Y9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkxuPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuVWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLiRkPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLmJlPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5Lbj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iuamk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Kcz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLnRkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTtiLnRmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07CmIubGc9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkZ2PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRXY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Jcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7CnZhciBrPWMuZ2t8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzEwXTt0aGlzLnRvPXRoaXMuYVszXTt0aGlzLldyPXRoaXMuYVs1XTt0aGlzLmJ0PXRoaXMuYVsxMF07dGhpcy5Ebz10aGlzLmFbM107dGhpcy5Qcz10aGlzLmFbMTBdO3RoaXMuSG89dGhpcy5hWzddO3RoaXMuS3c9dGhpcy5hWzldO3RoaXMuR2k9dGhpcy5hWzJdO3RoaXMuS2k9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5ScD1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSW46dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnRvOnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xcjp0aGlzLmF0KGEpfSxhdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnQ6dGhpcy5DbyhhKX0sQ286ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuRG86dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBzOnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ibzp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS3c6dGhpcy5GaShhKX0sRmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5HaTp0aGlzLkppKGEpfSxKaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2k6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLlJwfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Ibig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmlrPWI7Yi5wcm90b3R5cGU9e3plOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09CmEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LExxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LApsZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubGQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxFcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxZZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnplKHRoaXMuTHEoKSsiIiksCmE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaWt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMuT2k9dGhpcy5hWzVdO3RoaXMuRWk9dGhpcy5hWzhdO3RoaXMubnE9dGhpcy5hWzEwXTt0aGlzLmhtPXRoaXMuYVs0XTt0aGlzLkhrPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuR3c9YjtiLnByb3RvdHlwZT17bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1sOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53azp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhPwp0aGlzLk9pOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRWk6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ucTp0aGlzLmdtKGEpfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaG06dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5Hd3x8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MubGwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsCmY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLm9qPWJ9KShjKTt2YXIgTD1jLm9qfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNuPXRoaXMuYVs3XTsKdGhpcy5Vbz10aGlzLmFbMl07dGhpcy5DdT10aGlzLmFbOF07dGhpcy54cz10aGlzLmFbNF07dGhpcy5Fbj10aGlzLmFbNl07dGhpcy5Gbz10aGlzLmFbMl07dGhpcy5Kaz10aGlzLmFbN107dGhpcy5hbD10aGlzLmFbNF07dGhpcy5PcD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs5XX1jLnJvPWI7Yi5wcm90b3R5cGU9e0JuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVW86dGhpcy5CdShhKX0sQnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN1OnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54czp0aGlzLkRuKGEpfSxEbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRW46dGhpcy5FbyhhKX0sRW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkZvOnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLiRrKGEpfSwKJGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFsOnRoaXMuTnAoYSl9LE5wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5PcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucm98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLkJuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuU2w9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5NYT17fTt0aGlzLkk9bnVsbDt0aGlzLktjPTEwMDt0aGlzLkliPTA7dGhpcy5XYT0xNTA7dGhpcy5MYj0wO3RoaXMuanUoYil9LGc6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhPyh0aGlzLkliKyssdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLktjKSk6CjA+dGhpcy5XYSYmKHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5LYykpfSxhdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkliPnRoaXMuV2E/ITA6ITF9LGJmOmZ1bmN0aW9uKCl7dGhpcy5JYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sanU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LEpxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuUCgpLCEwKTt0aGlzLk1hW2IubGEoKV09YjtNJiZNLmdoJiZNLlB1KGIpfSxyeDpmdW5jdGlvbigpe3JldHVybiBlLnhlKHRoaXMuTWEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX0sTXI6ZnVuY3Rpb24oYil7Yj1iLkthKCk7Zm9yKHZhciBhIGluIHRoaXMuTWEpaWYoYi5pZD09CnRoaXMuTWFbYV0uS2EoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sSng6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy5TbHx8dDsoZnVuY3Rpb24oYyl7Yy5VbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLktjPTEwO3RoaXMuSWI9MDt0aGlzLldhPTUwO3RoaXMuWD1udWxsO3RoaXMubmE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkJiPSIiO3RoaXMucWc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5LYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxNOmZ1bmN0aW9uKCl7fSxOYTpmdW5jdGlvbigpe30sCnR1OmZ1bmN0aW9uKGIpe3RoaXMuWD1ifSxzeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlh9LG11OmZ1bmN0aW9uKGIpe3RoaXMuT2U9Yn0scXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PZX0sTmU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkliPD10aGlzLldhJiYodGhpcy5JYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuS2MpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpOwplbHNlIHJldHVybiExfWNhdGNoKGIpe319LEVnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2EoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sTHg6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuYnIoKXx8dGhpcy5ObigpO3RoaXMuQmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSx0eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxObjpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5hYSgxMCkpfSxicjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sVzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj0KYn0sS2E6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEJ4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmF9LGNhOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMH0sTGM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxJZTpmdW5jdGlvbigpe3JldHVybiExfSxKaDpmdW5jdGlvbihiKXt0aGlzLkJiPWJ9LHB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmJ9LEVoOmZ1bmN0aW9uKCl7dGhpcy5CYj1udWxsfSx2eDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuQmImJihiPSEwKTtyZXR1cm4gYn0sR3g6ZnVuY3Rpb24oKXt0aGlzLnFnfHwodGhpcy5xZz0hMCl9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLlVsfHxwOyhmdW5jdGlvbihjKXtjLnRpPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5JPXRoaXMucGxheWVyPSIiO3RoaXMuTGY9IjEiO3RoaXMuTWY9IjIiO3RoaXMuem49IjMiO3RoaXMuUWM9MDt0aGlzLm5oPQozMDt0aGlzLlJiPVtdO3RoaXMuZ2I9W107dGhpcy5vYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5aZj10aGlzLmZpPSExO3RoaXMuc3RhdHVzPXRoaXMuUWM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLmdmKGIpO3RoaXMua3UoYSl9LGc6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5maXx8KHRoaXMuZmk9ITAsZS5MZSgpKX0sU2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxEcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5rYSgpXXx8KHdpbmRvd1thLmthKCldPXt9KTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldfHwod2luZG93W2Eua2EoKV1bYi5sYSgpXT17fSx3aW5kb3dbYS5rYSgpXVtiLmxhKCldLmluaXRpYXRvcj0KZS5ZYigpKTt3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWWIoKV0/d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldKys6d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldPTF9LEpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2gua2EoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0mJndpbmRvd1toLmthKCldW2IubGEoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLmhmKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMueGEoKSl7dGhpcy5EcigpO2lmKCF0aGlzLkpyKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmhmKCk7cmV0dXJufXRoaXMuaGYoKTt0aGlzLkkodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLlpoKCk7dGhpcy5aZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSx1OmZ1bmN0aW9uKGIsCmEpe3RoaXMueGEoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmdiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxaaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuZ2Ipe2Zvcih2YXIgaD0wO2g8dGhpcy5nYi5sZW5ndGg7aCsrKXRoaXMub2NbdGhpcy5nYltoXS5yZWFzb25dPT10aGlzLm9jW2JdJiZhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLHRoaXMub2NbdGhpcy5nYltoXS5yZWFzb25dPHRoaXMub2NbYl0mJihhPVtdLGEucHVzaCh0aGlzLmdiW2hdLmRldGFpbCksYj10aGlzLmdiW2hdLnJlYXNvbik7dGhpcy5vY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITAsYSl9fSx1eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlpmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZn0saGY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxydTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuem59LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5RY30sUmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTGZ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLk1mfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5RY30sZ2Y6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxrdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxqczpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMudGl8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR0PXRoaXMuYVsyXTt0aGlzLiRzPXRoaXMuYVsxMF07dGhpcy55dz10aGlzLmFbN107dGhpcy5pbD10aGlzLmFbNl07dGhpcy5Naj10aGlzLmFbN107dGhpcy5Maz10aGlzLmFbMV07dGhpcy5mbz10aGlzLmFbNV07dGhpcy5ncT10aGlzLmFbOV07dGhpcy5tcD10aGlzLmFbOV07dGhpcy5udD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs5XX1jLm1rPWI7Yi5wcm90b3R5cGU9e2N0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kdDp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJHM6dGhpcy54dyhhKX0seHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnl3OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pbDp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5LayhhKX0sS2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5Mazp0aGlzLmVvKGEpfSxlbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZm86dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdxOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5tcDp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubnQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLm1rfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5jdCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87CnRoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Uanx8b2E7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLmR4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7CmIuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuVWp8fHBhOyhmdW5jdGlvbihjKXtjLlZqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Wanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmJuPXRoaXMuYVsxXTt0aGlzLm5yPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuQXQ9YjtiLnByb3RvdHlwZT17dW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZtOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLmJuOnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubnI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkF0fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy51bSg0KTsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5xcD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5iYz0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5XKGIpfSwKeGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KSwKYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJgozMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyOwphLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Da3x8c2E7KGZ1bmN0aW9uKGMpe2MuQms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYKKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ29tcGxldGUiKTsKdGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnFwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTt0aGlzLlNlKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMudygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJnRoaXMuVGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy53KCksdGhpcy5yYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sanM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8odGhpcy5yZT50aGlzLnNlJiYoYj0hMSksdGhpcy5HKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSw1MCk6KGEudmcoKSxhLnhnKCksYS5iY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ca3x8dGE7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5HcSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLk1yKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sb3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sR3E6ZnVuY3Rpb24oKXt2YXIgYj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnhiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB1YT1jLkRrfHx1YSx2YT1uZXcgdWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFqPXRoaXMuYVsxXTt0aGlzLlR2PXRoaXMuYVs0XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5sbT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLmpsPWI7Yi5wcm90b3R5cGU9e1BqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Rajp0aGlzLlN2KGEpfSxTdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHY6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJzOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMuamx8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlBqKDQpOwooZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5XKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlgmJnRoaXMuWCgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goaCl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0KITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHhhPWMuVm18fHhhOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5FYz10aGlzLkNhPXRoaXMuWGM9ITE7dGhpcy5BaD1lLkhiKDEwKTt0aGlzLmVpPSEwO3RoaXMudGM9dGhpcy5WZz0hMTt0aGlzLkZzKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5xaCgpLHRoaXMuWm8oKSx0aGlzLnFiKCkpfSxGczpmdW5jdGlvbihiKXtyZXR1cm4gZS5mYSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxIeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmNvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuWT9iLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlk/dHlwZW9mIGIuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5JYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5JYT9iLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLklhP3R5cGVvZiBiLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5JYT9iLkouSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLklhP3R5cGVvZiBiLkouSWEoKToidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5aZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLAoiOyIsYi5KP2IuSi5xYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLnFhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5oZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouaGU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5oZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkFoKX0seWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJgoodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxYYjpmdW5jdGlvbigpe2lmKCF0aGlzLnFhKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5xYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5xYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5xYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5xYX0sSWc6ZnVuY3Rpb24oKXtpZighdGhpcy5FYyl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5FYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkVjfSwKS3I6ZnVuY3Rpb24oKXtpZighdGhpcy5VZyl7dmFyIGI9dGhpcy55YigpLGE9dGhpcy5JcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVWc9ITApfXJldHVybiB0aGlzLlVnfSxJcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuWGMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlhjPSEwKTtyZXR1cm4gdGhpcy5YY30scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLlR0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sVHQ6ZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3ZhciBiPXRoaXMuSWcoKTtpZihifHx0aGlzLnhhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMuZ2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudWM9ITA7aWYoZS5mYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudWM9ITA7ZS5mYSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLnVjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy51Y3x8KHRoaXMudSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZ2EoKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxueDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMubmcmJmIuYWRzJiYodGhpcy5uZz1iLmFkcyk7cmV0dXJuIHRoaXMubmd9LFpvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdhKCEwKTt0aGlzLnUoInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5TZSgpfS5iaW5kKHRoaXMpKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5WKWhvbWFkVXRpbHMuVWEmJihiPQohMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWImJigoYj10aGlzLklnKCkpJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksNTApKX0scWg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuS3IoKSl7dmFyIGE9dGhpcy55YigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLnliKCksdGhpcy5YYigpLHRoaXMudGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50Yz90aGlzLncoKToodGhpcy5nYSghMCksdGhpcy51KCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpOwp0aGlzLnliKCl9ZWxzZSB0aGlzLlZnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpLGI9dGhpcy5YYigpO2EmJiFiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZ2EoKSk6KHRoaXMuZ2EoITApLHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLlZnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWgoKX0uYmluZCh0aGlzKSw1MCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPQphLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LCRvOmZ1bmN0aW9uKCl7dGhpcy56Y3x8KHRoaXMuemM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLnpjIT0KYi5hZHMuc3RhdGUmJih0aGlzLnpjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnpjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuemM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRvKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpezA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuUz8odGhpcy5lYT0hMCx0aGlzLm0oITApKToodGhpcy5lYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLnhhKCl8fChifHwodGhpcy5laT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5HKHRoaXMuZWksZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGhwOmZ1bmN0aW9uKCl7dGhpcy53eHx8KDEwPHRoaXMuVXY/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApKToodGhpcy5VdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLiR0KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhwKCl9LmJpbmQodGhpcyksNTApKSl9LCR0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlZ2KXt0aGlzLlZ2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciB5YT1jLlVtfHx5YTsoZnVuY3Rpb24oYyl7Yy5XbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy5RaCh3aW5kb3cpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuUWgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuVCgpfX0sUWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS54ZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm5hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwKKG5ldyB5YShhLHRoaXMuSSkpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxUOmZ1bmN0aW9uKCl7dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLktjKX19KX0pKGMpO3ZhciB6YT1jLldtfHx6YSxBYT1uZXcgemEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGw9dGhpcy5hWzEwXTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm5rPWI7Yi5wcm90b3R5cGU9e0dsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5IbDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBCYT1jLm5rfHxCYSxCYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuR2woNCk7KGZ1bmN0aW9uKGMpe2MuSmw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5VZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5jYSgpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkJiLGg9dGhpcy5sYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7CmQmJmEmJmEuYWMmJigwPD1oLmluZGV4T2YoZCl8fGEud2QoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlVlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlVlKys7aWYoMTA8dGhpcy5VZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwKIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7dmFyIENhPWMuSmx8fENhOyhmdW5jdGlvbihjKXtjLklsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8Cih0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudGU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLAoxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5xcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLnFxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucXQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuSWx8fERhOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgQ2EoYlthXSk7aC5uYXx8dGhpcy5OKGgpfHwodGhpcy5SKGgpLChuZXcgRGEoaCx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEVhPQpjLktsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXc9dGhpcy5hWzVdO3RoaXMuanY9dGhpcy5hWzNdO3RoaXMuc249dGhpcy5hWzFdO3RoaXMuenM9dGhpcy5hWzddO3RoaXMubW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy5BaT1iO2IucHJvdG90eXBlPXtIdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXc6dGhpcy5pdihhKX0saXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmp2OnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zbjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuenM6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9CmMuQWl8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLkh3KDQpOyhmdW5jdGlvbihjKXtjLnRrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkZnKGIsImVsZW1lbnRJRCIpO3N3aXRjaChiLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6YS5wYXJlbnROb2RlJiYoYT1hLnBhcmVudE5vZGUpfXRoaXMudXQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy51dCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSl9dGhpcy5XKGgpO3RoaXMuWihoKTt0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxncDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCkllOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy50a3x8SGE7KGZ1bmN0aW9uKGMpe2Muc2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMudSgiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMuc2t8fElhOyhmdW5jdGlvbihjKXtjLnVrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGI9bC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLnVrfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRms9dGhpcy5hWzhdO3RoaXMudHQ9dGhpcy5hWzhdO3RoaXMuT2o9dGhpcy5hWzNdO3RoaXMuUWw9dGhpcy5hWzVdO3RoaXMuR3I9dGhpcy5hWzJdO3RoaXMubHM9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbOF19Yy5Saj1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRms6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnR0OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Pajp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWw6dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdyOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMubHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYT1jLlJqfHxMYSxEYz1uZXcgTGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuams9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sbHU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxQbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmprfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmgsZCxmKXt0aGlzLmZiPWE7dGhpcy5BZz10aGlzLm5pPSExO3RoaXMucmg9ZDt0aGlzLlJoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLmZiPW5ldyB6KGEpKTt2YXIgYz10aGlzLnNiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkhlKHRoaXMuZmIudXJsKSYmbS5NZCl7dmFyIGU9bmV3IHooYS51cmwpO2UubHUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uaWEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiY0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5raz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5mYi5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5BZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuUmg/dGhpcy5zYi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCExKTp0aGlzLnNiLm9wZW4odGhpcy5mYi5tZXRob2QsdGhpcy5mYi51cmwsITApLHRoaXMubml8fCh0aGlzLnNiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5zYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuc2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuc2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkhlKHRoaXMuZmIudXJsKT9tLk1kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSGUodGhpcy5mYi51cmwpLHRoaXMucmgmJnRoaXMucmgoKX1yZXR1cm4gdGhpcy5zYn19fSkoYyk7dmFyIE1hPWMua2t8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLlZkPSExfWMucGo9YjtiLnByb3RvdHlwZT17cHU6ZnVuY3Rpb24oYSl7dGhpcy5WZD1hfSxvdTpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LFl0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkgZ290IGV2ZW50IixiLGEpfSl9dmFyIGI9e053OiJBZENsaWNrVGhydSIsUHc6IkFkRXJyb3IiLFF3OiJBZFN0b3BwZWQiLFR3OiJBZExpbmVhckNoYW5nZSIsVXc6IkFkVGFnUGFyc2VkIixYdzoiQWRWaWRlb0NvbXBsZXRlIiwkdzoiQWRMb2FkZWQiLGF4OiJBZFNraXBwZWQiLGJ4OiJBZFN0YXJ0ZWQiLFJ3OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsU3c6IkFkSW1wcmVzc2lvbiIsT3c6IkFkQ3JlYXRpdmVWaWV3IixWdzoiQWRWaWRlb01pZHBvaW50IixXdzoiQWRQYXVzZWQiLFl3OiJBZFZpZGVvU3RhcnQiLFp3OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuVmQsYltkXSl9LFh0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLApiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJyZWdpc3RlcmluZyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVWQpZm9yKHZhciBiIGluIHRoaXMuSGEuVWQpdGhpcy5IYS5VZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVWRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuVmQmJnRoaXMuWXQoKTt0aGlzLkhhJiZ0aGlzLlh0KCl9fX0pKGMpO3ZhciBOYT1jLnBqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy53Yz0iIjt0aGlzLmllPQp0aGlzLnZjPXRoaXMud2I9bnVsbDt0aGlzLkNwPXRoaXMuSmI9dGhpcy5paD0hMTt0aGlzLkxhPSIiO3RoaXMuZGg9ITE7dGhpcy53YT10aGlzLm9kPSIiO3RoaXMuWmc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuJGU9ITE7dGhpcy5wYT1bXTt0aGlzLk9nPXRoaXMuZmM9IiI7dGhpcy5xZT0hMTt0aGlzLnFmPTA7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5uYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaGM9IiI7dGhpcy5pYz1bXTt0aGlzLmpjPVtdO3RoaXMuSWQ9W107dGhpcy5nYz0iIjt0aGlzLnJmPTA7dGhpcy52aWRlb3BsYXphPQp7fTt0aGlzLkRjPSExO3RoaXMuaXA9dGhpcy5PZD1udWxsO3RoaXMuTGg9dGhpcy5sYz10aGlzLnNnPXRoaXMudWY9dGhpcy5NZD10aGlzLmtlPXRoaXMuUmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5wZD0wO3RoaXMuUWc9ITE7dGhpcy5QZz0xRTM7dGhpcy5aYz0hMTt0aGlzLlFhPTFFMzt0aGlzLk9mPSIifWMubGs9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy53YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLnZjLGFkdGFncmVnZXg6dGhpcy5pZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5paCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5DcCxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmRoLGdsb2JhbENvbmZpZzp0aGlzLm9kLGNsaWVudENvbmZpZzp0aGlzLndhLAppc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlYsaXNCbG9ja2VkOnRoaXMuWmcsc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZmMsaG9tYWRBZHBhdGg6dGhpcy5PZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnFmLEhPTUFEX1ZFUklGSUVEOnRoaXMuR2YsSE9NQURfQkxPQ0tFRDp0aGlzLkVmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm5jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5GZix0ZXN0SGlkZTp0aGlzLmhjLHRlc3RUYWdzOnRoaXMuaWMsdGVzdFRhZ3NKUzp0aGlzLmpjLHRlc3RUYWdzWEhSOnRoaXMuSWQsdGVzdENvb2tpZTp0aGlzLmdjLHRocm90dGxlOnRoaXMucmYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmlwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUmMsCmJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5rZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5NZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy51Zixjb25maWdGYWlsdXJlczp0aGlzLmhiLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLkloLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5qYix2cGFpZDp0aGlzLmxjLHNraXBBbGxvd2VkOnRoaXMuTGgsdm1hcHM6dGhpcy5raSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuWmMsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sJHE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmKGE9ITApO3JldHVybiBhfSxlZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSxIcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2JdJiYxPT10aGlzLmhiW2JdJiZhLnB1c2goYik7CnJldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLktvKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuR2UoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuRmMoKT9lPWE6ZT1jLnByb3RvY29sKwoiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLkpjKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMud2N8fHRoaXMud2J8fHRoaXMudmN8fHRoaXMuaWUpJiYoZz10aGlzLnJzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuSXEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxHZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT8KYj0hMDp0aGlzLkZjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxGYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5HZShhKTtyZXR1cm4gYn0sSXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PQp0eXBlb2YgdGhpcy5MYSYmMDx0aGlzLkxhLmxlbmd0aClyZXR1cm4gdGhpcy5MYTtmb3IoZCBpbiB0aGlzLkxhKWlmKGI9dGhpcy5MYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLml4O3JldHVybiJub25lIn0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLkloXX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnFkKCksYj10aGlzLktoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LG9oOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LHFzOmZ1bmN0aW9uKGEsCmIpe3ZhciBkPWUuemEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLm9oKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5vaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LHJzOmZ1bmN0aW9uKGEpe3RoaXMud2MmJihhKz10aGlzLndjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJgooYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy52YyYmKGE9dGhpcy5xcyhhLHRoaXMudmMpKTtyZXR1cm4gYX0sZnA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuYXAodGhpcy5GYS5jbGllbnRBUElzKX0sYXA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLnB1KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5vdShhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5kaD0hMDt0aGlzLm9kPWE7dGhpcy53YT1iO3RoaXMuJGU9ZDt0aGlzLk9kPWY7dGhpcy5BYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5mcCgpO3RoaXMuZXMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5jcygpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy54YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLndhKXRyeXt0aGlzLndhPWIsdGhpcy54YygpfWNhdGNoKGspe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9fSxwYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sZXM6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMub2QrdGhpcy5mZSgiZ2xvYmFsIikpLHRoaXMuV3EuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy54YygpfS5iaW5kKHRoaXMpLCEwKX0sY3M6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5mZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnhjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sZmU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2Upe3RoaXMua2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQWM9ITEpO3RoaXMuQWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5BYz90aGlzLkFjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy5aZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuRWYpKTt0aGlzLk5iKCk7ZS5CYyhrLmp0KTsoYj1lLlpiKHRoaXMucWQoKSkpfHwoYj1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxXcTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZmN8fHRoaXMuTGF8fHRoaXMueGMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seGM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZmM9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8Cm51bGw7dGhpcy5PZz1hLmFkcGF0aHx8IiI7dGhpcy5xZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkloPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZmMmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuR2MoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEdjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuSmMoKSksZD10aGlzLnphKHRoaXMuZmMpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPQoiUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuZmMrdGhpcy5mZSgiY3VzdG9tZXIiKSk7dGhpcy5EYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoImN1c3RvbWVyIik7YT90aGlzLmVtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZW09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkdjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxTdTpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkRjPSEwO3RoaXMuR2MoITApO3JldHVybn19dGhpcy5NZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuc2c9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmpiPQp0aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaGM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5qYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy53Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnZjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5pZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5paD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmxjPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5sYzt0aGlzLkxoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuJGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmtpPWIudm1hcHN8fCIiO3RoaXMuWmM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8CjFFMzt0aGlzLk9mPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmdjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuUHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnFlJiYodGhpcy5nYz1udWxsKTt0aGlzLnJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkRjPSEwLHRoaXMuR2MoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMubXYoKSYmKHRoaXMuaGN8fHRoaXMuamN8fHRoaXMuaWN8fHRoaXMuZ2N8fHRoaXMuSWQpP3RoaXMuJGU/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSksdGhpcy5tZSgpLHRoaXMuTmIoKSk6dGhpcy5ZdSgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlp1KCkpfX0sWXU6ZnVuY3Rpb24oKXt0aGlzLlh1KCk7CnRoaXMuJHUoKX0sJHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsCiIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9CmQpe3ZhciBjPWUuaGQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxadTpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpO3RoaXMuTmIoKX0sT2M6ZnVuY3Rpb24oYSl7dGhpcy5SYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIoYSkpLHRoaXMuTmIoKSx0aGlzLm1lKCkpfSxYdTpmdW5jdGlvbigpe2lmKHRoaXMuaGMpe3ZhciBhPWUuaGQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmhoKCkpdGhpcy5PYyh0aGlzLm5jLAoibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5oYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5WaCgpfX1lbHNlIHRoaXMuVmgoKX0sVWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLkhiKCkpO3RoaXMuY3YoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm5mLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5PYyh0aGlzLm5jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuaWM9dGhpcy5JZCkmJnRoaXMuaWMubGVuZ3RoKXt2YXIgZD10aGlzLmljLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubmYoKX0sY3Y6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGMsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5VaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5qYyYmdGhpcy5qYy5sZW5ndGgpe3ZhciBkPXRoaXMuamMuc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5VaCgpfSxkdjpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LG5mOmZ1bmN0aW9uKCl7dGhpcy5nYz8odGhpcy5xZisrLHRoaXMuRGEobmV3IHoodGhpcy5nYyksdGhpcy5XdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5vZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlNoKCl9LG9mOmZ1bmN0aW9uKGEpe3RoaXMuT2ModGhpcy5GZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LFd1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnFmP3RoaXMubmYoKTp0aGlzLm9mKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuU2goKTp0aGlzLm9mKCJBQUEiKX0sU2g6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5tZSgpfSxoaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUmMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaGgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5PZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk9kJiZ0aGlzLk9kKCl9LGVwOmZ1bmN0aW9uKCl7aWYodGhpcy51ZiYmdGhpcy4kcSgpKXt2YXIgYT10aGlzLkhxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxaaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnBkfHwodGhpcy5wZD0wKTt0aGlzLnBkKys7dGhpcy5wZD50aGlzLlBnJiYhdGhpcy5RZyYmKHRoaXMuUWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlBnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5uaT0hMCk7cSYmZS5OcigpJiYoYS5BZz0hMCk7ZyYmKGEuUmg9ITApO3JldHVybiBhLmxvYWQoKX0sYnA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxWdTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMua2l9LGNwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMuSXYuYmluZCh0aGlzKSx0aGlzLkh2LmJpbmQodGhpcykpfSxJdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMubHEoKX0sSHY6ZnVuY3Rpb24oKXt9LApscTpmdW5jdGlvbigpe2UuQmMoay5rcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYWIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxtdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnJmfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmxrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucG09dGhpcy5hWzFdO3RoaXMuQ209dGhpcy5hWzJdO3RoaXMueGw9dGhpcy5hWzRdO3RoaXMuQ3Q9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMl19Yy5aaj1iO2IucHJvdG90eXBlPXtvbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucG06dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNtOnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueGw6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMuWmp8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLm9tKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmJiPWEuZi5QKCk6dGhpcy5iYj0iIjthLmYuWGcmJmEuZi5YZyh7cGF1c2U6dGhpcy53ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkdoLmJpbmQodGhpcyksbXV0ZTp0aGlzLlBlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuQXYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5pYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlZiPXRoaXMuWWM9ITE7dGhpcy5Jbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkZkPXt9O2Uub2IoIm5ld0JpZ0FkSWQiKTt0aGlzLkxvPWUuYWEoMTApO3RoaXMubGY9MDt0aGlzLldjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuV2M9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYKKGE9dGhpcy5iLmYucygpKSx0aGlzLldjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlZuPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuc2g9dGhpcy5FZD0hMTt0aGlzLmxoPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5lZT0hMTt0aGlzLmJpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYWM9ITE7dGhpcy5zcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5NaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5QZD10aGlzLk9iPXRoaXMub2U9dGhpcy5lZD10aGlzLkdkPXRoaXMucmI9dGhpcy5tYz10aGlzLnVoPXRoaXMua2Q9dGhpcy5udj10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5yYz1bXTt0aGlzLmNjPXt9O3RoaXMuZ3Q9MjAwO3RoaXMuQmY9CnRoaXMuQ2Y9dGhpcy5qZT10aGlzLkFmPXRoaXMuWmU9ITE7dGhpcy52ZD17fX1jLmZrPWI7Yi5wcm90b3R5cGU9e2d1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGJ9LCRoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkNiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5MdSgpO2UudihrLkxuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEtlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5sZisrLGUub2IoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5lcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJgp0aGlzLkwuaXNFbmFibGVkPyh0aGlzLiRoKCksbmV3IFModGhpcyxhLHRoaXMubGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmxjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuJGgoKSxuZXcgUyh0aGlzLGEsdGhpcy5saCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5sYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7CmVsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLktlKGEsYixjKX0sNTApfX0sVmU6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5rZD0hMTt0aGlzLmM9YTt0aGlzLnV1KHRoaXMuYyk7dGhpcy52ZD1uZXcgUWEodGhpcy5jLkt2LHRoaXMudmlkZW8se30pO3RoaXMuTGcoYSk7dGhpcy5yYz10aGlzLkNnKGEpO3RoaXMubnAoKX0sTGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuRmQ9dGhpcy5TcShhKSksdGhpcy5MZyhhLnBhcmVudCkpfSxDZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuQ2coYS5wYXJlbnQpKSxjLnB1c2godGhpcy5DcShhKSkpO3JldHVybiBjfSwKQ3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LFNxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8CmYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5rYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZ2QmJmEuZ2QuZXJyb3ImJmEuZ2QuZXJyb3IuY29kZSYmKGI9YS5nZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlBjLmNvZGU6Yj09Ry5XZC5jb2RlP2UudihrLmh3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSwKdGhpcy5DKCksdGhpcy5BKCkpOihlLkxlKCksYj09Ry5KZi5jb2RlJiZlLnYoay5Hcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5qcSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuTXUoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmUudihrLkp2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLnYoay5wdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUudihrLnd3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5Icyx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsuRnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsuR3YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuV2IoYSk7dGhpcy5SYSgpfSxXYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLkplKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSx1dTpmdW5jdGlvbihhKXt0aGlzLm9lPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTsKdGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5aZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLkl4PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7CnRoaXMuVm4mJnRoaXMucGxheWVyLnVlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci51ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuUW4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLlplJiZiLmxvYWQoKTtpZih0aGlzLldoKGIpKXt0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt0aGlzLlRuKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5aZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz0KdGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLm9wKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5zdSgpKTp0aGlzLmMub3JpZ2luLnRnKHcuVGQpfSxzdTpmdW5jdGlvbigpe3RoaXMuQWY9ITA7dGhpcy5yYj10aGlzLm1jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnJiPSEwKTtlLm5lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlVuKHRoaXMuYy5vcmlnaW4udmEpOwp0aGlzLk5oKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnZoKCk7dGhpcy5iLmpmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5qZigpO3RoaXMudGE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmdpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuVnEoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuY2coImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmdlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuR2QmJnRoaXMuYi5mLkFhKCkmJmUudihrLnljLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi4kYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5yYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuWHYoKSx0aGlzLmIuJGIoITApLCF0aGlzLk9iKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsCmNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5GZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLiRiKCEwKSx0aGlzLmV3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN3KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR3KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZncoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuYncoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubGkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9CmEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlViKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmtnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5aYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuYmUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT0KYS5kYXRhLm5hbWUmJih0aGlzLkNmJiYodGhpcy5CZj0hMSx0aGlzLmVjKCkpLHRoaXMuWnYoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnJiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpOwplLmdlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuZ2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuJGYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubWM9ITB9LFp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSk7dGhpcy5tYz0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLk9oKCk7ZS52KGsuU2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sZXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sY3c6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5rZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSl9LGR3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlVmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxidzpmdW5jdGlvbigpe3RoaXMud2YoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxsaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm5lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSwKV3Y6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmd3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5saSghMCl9LFFuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5GYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5Sdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LApXaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sVG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxBZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5oaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuaWkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy53Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnhmLmJpbmQodGhpcykpfSxoaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMueWYoYSl9LmJpbmQodGhpcyksdGhpcy5JbykpfSx5ZjpmdW5jdGlvbihhKXtpZighdGhpcy5ZYyYmdGhpcy5XaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLlZiKXt0aGlzLlljPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5BZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnNnfHwKdGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuT3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5qZigpO3RoaXMuTnYoKTt0aGlzLmdpKCk7dGhpcy5kZygpO3RoaXMuYi52aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5tZigpfX0sbWY6ZnVuY3Rpb24oKXt0aGlzLmVkfHx0aGlzLlFmKCl9LFFmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZWR8fChhP3RoaXMuUmEoKToodGhpcy5QZSghMCksdGhpcy5RZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuZGMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0uYmluZCh0aGlzKTt0aGlzLndlKCkuSmgodGhpcyl9LHdmOmZ1bmN0aW9uKCl7dGhpcy5MLmpiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkpuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxNbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkdnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuSnUoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlFkJiZ0aGlzLk1uKHRoaXMuYy5RZCk7CmlmKCF0aGlzLm9lKWlmKHRoaXMub2U9ITAsdGhpcy5QZHx8KGUudihrLkpzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucGMpe2Uub2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMubGYrKzt0aGlzLlZiPXRoaXMuWWM9ITE7dHJ5e3RoaXMuQWQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkVkPSExO3RyeXt0aGlzLmIuZGkoKX1jYXRjaChnKXt9dGhpcy5HZD0hMDt0aGlzLmIuQWUoKTt0aGlzLmFjPSExO3RoaXMud2UoKS5FaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5RZSgpO3RoaXMuYy5wYyYmKGE/dGhpcy5jLm9yaWdpbi5waCgpOnRoaXMucGUoKSl9ZWxzZSB0aGlzLnBlKCl9LApSdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMueGYoYSkpfSx4ZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5icCgpO3RoaXMuYy5vcmlnaW4udGcody5UZCl9LGlpOmZ1bmN0aW9uKCl7aWYodGhpcy5udil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5HZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsueWMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnJ2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlBkPSEwO2UudihrLmppLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkZlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmtmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1oKSkmJihjPXRoaXMuYy5rZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuRWR8fCh0aGlzLkVkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLldmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLlZiPXRoaXMuWWM9ITEsdGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkVkPSExLHRoaXMuYi5kaSgpLHRoaXMuYy5vcmlnaW4uUWUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5XYy5yZXBsYWNlKCJbdGltZV0iLGUuQmcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5lZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGFpOmZ1bmN0aW9uKCl7dGhpcy51aHx8KHRoaXMudWg9ITAsdGhpcy5rZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2UudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5iaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmFpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5haSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLk9oKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwuamImJgp0aGlzLllhKCJzdGFydCIpLGUudihrLlNmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5rZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlBmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKgp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmJpPWEpfSxOaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sTHU6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LE9oOmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxNdTpmdW5jdGlvbigpe2UuS2QoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLktkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5BZnx8dGhpcy5MLmpiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmpiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMudmQmJnRoaXMudmQudHJhY2smJnRoaXMudmQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuVHEodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5qZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkZkLmltcHJlc3Npb25zJiYKZS5McihnLnVybCx0aGlzLkZkLmltcHJlc3Npb25zKT90aGlzLkplKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Lbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5GZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSmUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnlwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5BZiYmKGI9Il92cGFpZCIpO3RoaXMuQ2YmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sSmU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5QbihjKSxmfHwKKGY9dGhpcy5yZyksZXx8KGU9dGhpcy5yZyksdGhpcy5SbihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5EaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5jY1thXT0ib3BlbiJ9LERoOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09ImNsb3NlZCJ9LG5wOmZ1bmN0aW9uKCl7dGhpcy5jYz17fX0sT3U6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5jYyl0aGlzLmNjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuY2NbYl0mJmErKztyZXR1cm4gYX0sVHE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx5cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLlB2LmJpbmQodGhpcykpfSxQdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZWMoKTp0aGlzLmMuVWImJihlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sTnY6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuV2MucmVwbGFjZSgiW3RpbWVdIixlLkJnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuJGMmJihiPXRoaXMuTC4kYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLAoxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLiRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZ2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnNwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLApmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlhoLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06CihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnF2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucHYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgoobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuTWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5rZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwKKHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksCmMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlBlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZWM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuQmZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFhoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5tYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubWM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubWM9ITApfSx3ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sR2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0scHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LHF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5yYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnJiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5yYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxQZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay50Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZGM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5kYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZGMpO3RoaXMuZWR8fHRoaXMuZWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm1mKCkpfSxwZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5oZCgpOyF0aGlzLkwubGN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmplJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnNofHwhdGhpcy5MLlJjJiYic3BpZWdlbC5kZSIhPWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5lZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm1nKCkpOih0aGlzLnNoPXRoaXMuQ2Y9dGhpcy5CZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmplPSEwLGE9ZS5jZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5LZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbWc6ZnVuY3Rpb24oYSl7dGhpcy5PdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWcoITApfS5iaW5kKHRoaXMpLHRoaXMuZ3QpOih0aGlzLkdkPSEwLHRoaXMuYi5BZSgpLHRoaXMuYi5idSgpLHRoaXMuYWM9ITEsCmUudihrLnJwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy53ZSgpLkVoKCkpfSx3ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkVlKHRoaXMudmlkZW8sYSk/dGhpcy5HaCgpOnRoaXMud2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5VYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnJjJiYwPHRoaXMucmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnJjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5MbysiLSIrdGhpcy5sZjt0aGlzLmMmJnRoaXMuYy5IZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSGcoKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ma3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGo9dGhpcy5hWzVdO3RoaXMua289dGhpcy5hWzJdO3RoaXMuUnM9dGhpcy5hWzhdO3RoaXMubHc9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy50bj1iO2IucHJvdG90eXBlPXtzajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudGo6dGhpcy5qbyhhKX0sam86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmtvOgp0aGlzLlFzKGEpfSxRczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnM6dGhpcy5rdyhhKX0sa3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmx3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy50bnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuc2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLmhzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLlNtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmhkKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5EYShiLHRoaXMuZ3MuYmluZCh0aGlzKSx0aGlzLmRzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5RcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5WdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxRcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuTHQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9CnRoaXMuRGcoKTt0aGlzLnNjPXRoaXMucGYoKTt0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEucmVzcG9uc2VVUkw7dGhpcy5ZLmxlbmd0aD90aGlzLkljKCk6dGhpcy5zYSh0aGlzLlNhKHcuUGMse2Vycm9yOnRoaXMuemY/Ry5XZDpHLklmfSkpfSxoczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpO3RoaXMucWM9dGhpcy5UaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sZHM6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5IZix7ZGVwdGg6YX0pKX0sSWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5TcigpP3RoaXMuZXYoKT8oYSsrLApuZXcgYih0aGlzLHRoaXMuTWcoKSxoLHtBZFN5c3RlbTp0aGlzLkJxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMuc2EodGhpcy5TYSh3LktmKSk6KGE9MCx0aGlzLkR2KCkmJnRoaXMuVmUodGhpcy53cCgpKSl9LFFlOmZ1bmN0aW9uKCl7dGhpcy5zYz8odGhpcy5zYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5RZSgpfSxwaDpmdW5jdGlvbigpe3RoaXMucWM/KHRoaXMucWM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQucGgoKX0sRHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idigpP3RoaXMuYXYoKT8hMDooLTEhPXRoaXMuQ2MoKT90aGlzLnNhKHRoaXMuU2Eody5TZCkpOnRoaXMuc2EodGhpcy5TYSh3LkRmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5QYyxHLkpmKSksITEpfSxWZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5RZHx8KGEuUWQ9CltdKTthLlFkLnB1c2godGhpcy5TZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk1lKCkpO2EudGI9YS50Yj9hLnRiOnRoaXMuc2M7YS5wYz1hLnBjP2EucGM6dGhpcy5xYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5wYXJlbnQuVmUoYSl9LHdwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuQ2MoKTthLk89dGhpcy5KZygpO2EuVWI9dGhpcy5EcSgpO2EuS3Y9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5BcSgpO2Eua2Y9dGhpcy5ScShhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLnpnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT13LlNkLmNvZGU/Yi5QYS5jb25jYXQodGhpcy5FcSgpKTpiLlBhLmNvbmNhdCh0aGlzLk1xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuV2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sZXY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxidjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuSmcoKS5sZW5ndGh9LAphdjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQ2MoKX0scGY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxUaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucGYoKSYmKGE9ITApO3JldHVybiBhfSxMdDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sU3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk1nKCkubGVuZ3RofSxNZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwKIlZBU1RBZFRhZ1VSSSIpfSxCcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwiQWRTeXN0ZW0iKX0sTWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy4kZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LCRnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuJGcoYS5wYXJlbnROb2RlKToKITF9LE1xOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxEcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxKZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSwKang6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsCmM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMubmQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LENjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxScTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd1KGQsYSksMD5iJiYKKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLlNtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllrPXRoaXMuYVszXTt0aGlzLk1zPQp0aGlzLmFbN107dGhpcy5rcD10aGlzLmFbMTBdO3RoaXMuWm49dGhpcy5hWzddO3RoaXMucHQ9dGhpcy5hWzVdO3RoaXMuVXU9dGhpcy5hWzhdO3RoaXMueHY9dGhpcy5hWzEwXTt0aGlzLnlrPXRoaXMuYVs3XTt0aGlzLmh2PXRoaXMuYVs4XTt0aGlzLnZpPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuWXA9YjtiLnByb3RvdHlwZT17WGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zazp0aGlzLkxzKGEpfSxMczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTXM6dGhpcy5qcChhKX0sanA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtwOnRoaXMuWW4oYSl9LFluOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abjp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucHQ6dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV1OnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy54djoKdGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlrOnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5odjp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLllwfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Yayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlViPSIiO3RoaXMuQj10aGlzLnBjPXRoaXMudGI9ITE7dGhpcy5CZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuQ2U9IiJ9Yy5SbD1iO2IucHJvdG90eXBlPXtvcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSwKYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxLcTpmdW5jdGlvbigpe2lmKCF0aGlzLkJlJiYKdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkdhKXt2YXIgYT10aGlzLm9yaWdpbi5HYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkJlPWFbY10pfXJldHVybiB0aGlzLkJlfSxIZzpmdW5jdGlvbigpe2lmKHRoaXMuQ2UpcmV0dXJuIHRoaXMuQ2U7dmFyIGE9IiI7KGE9dGhpcy5LcSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuQ2U9YX0sVnE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLlJsfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuaW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMV19Yy5pdD1iO2IucHJvdG90eXBlPXtobzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLml0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5obyg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LERmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxQYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCk9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEx3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSWk9dGhpcy5hWzldO3RoaXMuQXc9dGhpcy5hWzEwXTt0aGlzLnlyPXRoaXMuYVsyXTt0aGlzLkFyPXRoaXMuYVsxXTt0aGlzLnZ3PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuSXA9YjtiLnByb3RvdHlwZT17SGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklpOnRoaXMuencoYSl9LHp3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bdzp0aGlzLnhyKGEpfSx4cjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXI6dGhpcy56cihhKX0senI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Bcjp0aGlzLnV3KGEpfSx1dzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLklwfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5IaSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmdkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuU2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlNqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zcj10aGlzLmFbMTBdO3RoaXMuVmk9dGhpcy5hWzFdO3RoaXMubG49dGhpcy5hWzRdO3RoaXMueHE9CnRoaXMuYVszXTt0aGlzLlVyPXRoaXMuYVs0XTt0aGlzLkN2PXRoaXMuYVsxXTt0aGlzLmpqPXRoaXMuYVs4XTt0aGlzLnltPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuenQ9YjtiLnByb3RvdHlwZT17WHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLllyOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5WaTp0aGlzLmtuKGEpfSxrbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubG46dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhxOnRoaXMuVHIoYSl9LFRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vcjp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMueG0oYSl9LHhtOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy55bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLnp0fHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5Ycig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuRmg9YTt0aGlzLnZpZGVvPWI7dGhpcy5OZD1bXTt0aGlzLkNoPVtdO3RoaXMuUmU9W107dGhpcy5Rdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuTSgpfWMuWms9YjtiLnByb3RvdHlwZT17TTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5GaC5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZoW2FdLApjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLkV4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlp0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLlF0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz0KYztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuTmQucHVzaCh7c3JjOmMsZnJhbWU6ZyxodDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5SZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlJlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy5GcShhKSl9fSxGcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntOeDohMCxNeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntBeDoidmlkZW8iLFB4OiJqc0N1c3RvbSIsUXg6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxSeDoxLApreDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LFVxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5OZC5sZW5ndGg7YisrKWlmKHRoaXMuTmRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5OZFtiXS5odDtyZXR1cm4iIn0sWnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkNoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlVxKGIpLHZlbmRvcjpifSk7dGhpcy5LdSgpfSxRdDpmdW5jdGlvbihhLGIpeyJ2aWRlbyI9PT1hP3RoaXMuUXYubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSwKYil9LmJpbmQodGhpcykpOnRoaXMuYWcoYSxiKX0sYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLlJlLnB1c2goe3R5cGU6YSxWbzpiLEt4OiExfSl9LEt1OmZ1bmN0aW9uKCl7dGhpcy5DaC5tYXAoZnVuY3Rpb24oYSl7YS5Pcnx8KGEuRHgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLk94LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Pcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5aa3x8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXU9dGhpcy5hWzldO3RoaXMub3c9dGhpcy5hWzhdO3RoaXMud3U9dGhpcy5hWzldO3RoaXMuc2w9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5vcj1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmV1OnRoaXMubncoYSl9LG53OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vdzp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud3U6dGhpcy5ybChhKX0scmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnNsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5vcnx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuZHUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5pYj1hLkVnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmJnPSExO3RoaXMuVGI9W119Yy51aj1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnpxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5rcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDsKZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUnU6ZnVuY3Rpb24oKXt0aGlzLmJnPSEwfSxkaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5mLnMoKSl9LGJ1OmZ1bmN0aW9uKCl7dGhpcy5iZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZGQsdGhpcy5mLnMoKSkpfSxqZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5pYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5pYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTt0aGlzLmYuTGMmJnRoaXMuZi5MYygpP3RoaXMuZi5FZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LGtyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx0cTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249Yi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSwkYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRxKHRoaXMuaWIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQWUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkxjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9CmIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUuUGgodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy4kYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEFlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTsKZm9yKHZhciAkYT1jLnVqfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy4kcD10aGlzLmFbMV07dGhpcy5Cbz10aGlzLmFbNF07dGhpcy5NbD10aGlzLmFbNF07dGhpcy54bj10aGlzLmFbMV07dGhpcy5Ybj10aGlzLmFbNF07dGhpcy52dj0KdGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5pdz1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMub286dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRwOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cbzp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWw6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhuOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Ybjp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudnY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5pd3x8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLm5vKDQpOyhmdW5jdGlvbihjKXtjLkRsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5CZChiKTt0aGlzLnBnKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKSl9LApwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxBYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkOwpiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGNiPWMuRGx8fGNiOyhmdW5jdGlvbihjKXtjLkNsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kYSgpO3RoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5UZj10aGlzLlZmPXRoaXMuV2c9dGhpcy5lYT10aGlzLnNmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucnEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuV2cmJnRoaXMuamcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmYS5hYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmJkKCk7dGhpcy5XZz0hMDt0aGlzLmpnKCl9LmJpbmQodGhpcykpO3RoaXMuZmcoKX0samc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5iZCgpO2lmKCF0aGlzLnNmJiYhdGhpcy5iZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuc2YmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LApLZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxmZzpmdW5jdGlvbigpe2lmKHRoaXMuYmQoKSl7dmFyIGI9dGhpcy5LZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9Yi5oeH10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LGx4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLnl4KCk6ITF9LENjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/CmIuQ2MoKTotMX0sTnE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0scnE6ZnVuY3Rpb24oYixhKXt0aGlzLlNiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5EZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLk5xKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBkYj1jLkNsfHxkYjsoZnVuY3Rpb24oYyl7Yy5FbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFByOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlZsLkFuLnluP3dpbmRvdy5PTy5WbC5Bbi55bi5meChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnhlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYywKdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBlYj1jLkVsfHxlYixmYj1uZXcgZWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXA9dGhpcy5hWzhdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuYWo9dGhpcy5hWzFdO3RoaXMuZHI9dGhpcy5hWzRdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMuaHI9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzhdO3RoaXMucGs9dGhpcy5hWzNdO3RoaXMuR2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbN119Yy5GcD1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuJGkoYSl9LCRpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5hajp0aGlzLmNyKGEpfSxjcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhPwp0aGlzLmRyOnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kbjp0aGlzLmdyKGEpfSxncjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaHI6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnVyOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wazp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5GcHx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuRHAoNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk5nKCl9LApOZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy55aCgpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuZmp8fGhiOyhmdW5jdGlvbihjKXtjLmVqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSwKdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmdnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2coYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuZWp8fGliOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCkJoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zcXx8KHRoaXMuc3E9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkJoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5CaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuZ2p8fGpiLFQ9bmV3IGpiKHIpO1QuZygpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xbD10aGlzLmFbOF07dGhpcy5zcj10aGlzLmFbNV07dGhpcy5JdT10aGlzLmFbMTBdO3RoaXMuY289dGhpcy5hWzldO3RoaXMuRnc9dGhpcy5hWzhdO3RoaXMuR209dGhpcy5hWzhdO3RoaXMuQ2o9dGhpcy5hWzhdO3RoaXMuam49dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMV19Yy50cD1iO2IucHJvdG90eXBlPXtwbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWw6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNyOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JdTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY286dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZ3OnRoaXMuRm0oYSl9LEZtOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuR206dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMudHB8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnBsKDQpOyhmdW5jdGlvbihjKXtjLnJtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ybXx8VTsoZnVuY3Rpb24oYyl7Yy5xbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIisKYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guVmMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5OcyhhKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5acSgpfSxOczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7CnJldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5yYSgpO3JldHVybn19dGhpcy51KCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMucW18fFY7KGZ1bmN0aW9uKGMpe2Muc209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUuQnAoYix0aGlzLnVkKSk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMudWR8fCh0aGlzLnVkPVtdKSx0aGlzLnVkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSwKZnY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5IY3x8KHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChiKSx0aGlzLmF1KCkmJih0aGlzLmJmKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LFpxOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGI9MDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPQowO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LmZ2KGIpfX0pfSkoYyk7dmFyIGxiPWMuc218fGxiLHg9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWo9dGhpcy5hWzhdO3RoaXMuU2k9dGhpcy5hWzJdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMuYnM9dGhpcy5hWzJdO3RoaXMuem89dGhpcy5hWzNdO3RoaXMuZXE9dGhpcy5hWzNdO3RoaXMuYW89dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNl19Yy5MbT1iO2IucHJvdG90eXBlPXt6ajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFqOnRoaXMuUmkoYSl9LApSaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU2k6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBvOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5iczp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem86dGhpcy5jcShhKX0sY3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVxOnRoaXMuJG4oYSl9LCRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1iPWMuTG18fG1iLE9jPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLnpqKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7CnRoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LEFhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuYmp8fG5iOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy51KCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLmNqfHxvYjsoZnVuY3Rpb24oYyl7Yy5kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IG5iKGQpO3RoaXMuTihnKXx8Cih0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuTWFbYi5sYSgpXT8hMDohMX19KX0pKGMpO3ZhciBwYj1jLmRqfHxwYixxYj1uZXcgcGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzldO3RoaXMuQWs9dGhpcy5hWzldO3RoaXMuS2o9dGhpcy5hWzJdO3RoaXMuZnI9dGhpcy5hWzRdO3RoaXMuUWs9dGhpcy5hWzEwXTt0aGlzLndqPXRoaXMuYVs1XTt0aGlzLmlxPXRoaXMuYVs5XTt0aGlzLkN3PXRoaXMuYVszXTt0aGlzLkl0PXRoaXMuYVsxMF07dGhpcy5WcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX0KYy5Xbz1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ0OnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuS2o6dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZyOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Razp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2o6dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pcTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3c6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkl0OnRoaXMuVXAoYSl9LFVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuajphfX19KShjKTt2YXIgcmI9Yy5Xb3x8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuZXQoNCk7KGZ1bmN0aW9uKGMpe2MudWw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMuUHQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sUHQ6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucGF1c2UmJnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiYKdGhpcy5qYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnVubXV0ZSYmdGhpcy5qYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFhnOmZ1bmN0aW9uKGIpe3RoaXMuamE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMudWx8fHNiOyhmdW5jdGlvbihjKXtjLnRsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5taT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5taSYmKHRoaXMuRygpLHRoaXMubWk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnRsfHx0YjsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApnOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBiPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy52bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLnhpPXRoaXMuYVsxXTt0aGlzLnZxPXRoaXMuYVszXTt0aGlzLndyPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuU3M9YjtiLnByb3RvdHlwZT17ZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVrOnRoaXMud2koYSl9LAp3aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGk6dGhpcy51cShhKX0sdXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZxOnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy53cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuU3N8fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmRrKDQpOyhmdW5jdGlvbihjKXtjLlltPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlcoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5YPygwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7CnZhciB3Yj1jLlltfHx3YjsoZnVuY3Rpb24oYyl7Yy5YbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxYYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sTnQ6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucmEoKTp0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy50Yz0KITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5OdCh0aGlzLkNhKToodGhpcy5DYT10aGlzLlhiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpO3JldHVybn1pZighdGhpcy50Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucmEoKTsKZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLlhtfHx4YjsoZnVuY3Rpb24oYyl7Yy5abT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuWm18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudnA9dGhpcy5hWzVdO3RoaXMuUG09dGhpcy5hWzEwXTt0aGlzLnBzPXRoaXMuYVs2XTt0aGlzLmRsPXRoaXMuYVszXTt0aGlzLk1pPXRoaXMuYVsyXTt0aGlzLkNpPXRoaXMuYVs5XTt0aGlzLmFtPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVsyXTt0aGlzLnFvPXRoaXMuYVszXTt0aGlzLm9sPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzNdfWMuWnI9YjtiLnByb3RvdHlwZT17dXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZwOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QbTp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucHM6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NaTp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ2k6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5hbTp0aGlzLnptKGEpfSx6bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQW06dGhpcy5wbyhhKX0scG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFvOnRoaXMubmwoYSl9LG5sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMuWnJ8fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLnVwKDQpOyhmdW5jdGlvbihjKXtjLmNtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5XZT0hMX0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucnQoKX0uYmluZCh0aGlzKSw1MDApfSxydDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLldlJiYKd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LE51OmZ1bmN0aW9uKCl7dGhpcy5XZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuY218fEJiOyhmdW5jdGlvbihjKXtjLmJtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5rYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ucz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMua2N8fCh0aGlzLmtjPQowLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmtjfHx0aGlzLmtjKyssdGhpcy5rYzw9dGhpcy5ucz8odGhpcy5rYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuTnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBDYj1jLmJtfHxDYjsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuZG18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bj10aGlzLmFbM107dGhpcy5qbT10aGlzLmFbNl07CnRoaXMuU2s9dGhpcy5hWzNdO3RoaXMuQ3I9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5XbD1iO2IucHJvdG90eXBlPXt1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5pbShhKX0saW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmptOnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Tazp0aGlzLkJyKGEpfSxCcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLldsfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1TYy51big0KTsoZnVuY3Rpb24oYyl7Yy5ZbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5ZbHx8R2I7KGZ1bmN0aW9uKGMpe2MuWGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuS2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnBwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMubWQoKTsKMDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy4kcigpOnRoaXMuaWcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxwcDpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5tKCEwKX0sJHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7IWIucWEmJmIuWSYmYi5leCYmYi5neCYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGlnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PQpiPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCl9LmJpbmQodGhpcyksMTAwKX0sbWQ6ZnVuY3Rpb24oKXtpZighdGhpcy50aClmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuS2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudGg9YltjXSk7cmV0dXJuIHRoaXMudGh9LHp4OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLm1kKCkuYWRzTG9hZGVyP3RoaXMuRyghMCk6dGhpcy5HKCk6dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBIYj1jLlhsfHxIYjsoZnVuY3Rpb24oYyl7Yy5abD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgSGIoYyx0aGlzLkkpKS5nKCkpfXJldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgSWI9Yy5abHx8SWIsSmI9bmV3IEliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBxPXRoaXMuYVsxMF07dGhpcy5xcj10aGlzLmFbN107dGhpcy5PbD10aGlzLmFbMTBdO3RoaXMuRXQ9dGhpcy5hWzhdOwp0aGlzLnR3PXRoaXMuYVsxMF07dGhpcy50dj10aGlzLmFbOF07dGhpcy5CbD10aGlzLmFbM107dGhpcy5saj10aGlzLmFbM107dGhpcy5ubT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLnhwPWI7Yi5wcm90b3R5cGU9e29xOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5wcTp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXI6dGhpcy5ObChhKX0sTmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9sOnRoaXMuRHQoYSl9LER0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5FdDp0aGlzLnN3KGEpfSxzdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHc6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR2OnRoaXMuQWwoYSl9LEFsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CbDp0aGlzLmtqKGEpfSxrajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGo6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMubm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLnhwfHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5vcSg0KTsoZnVuY3Rpb24oYyl7Yy5Waz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7SCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlcoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LAp4eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Wa3x8WDsoZnVuY3Rpb24oYyl7Yy5Vaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhlPWIuaWQpO0g/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGUmJmIhPXRoaXMuWGV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmCiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkZ4KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy51KCJhZGVycm9yIiksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFk9Yy5Va3x8WTsoZnVuY3Rpb24oYyl7Yy5Xaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/CiExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWChiKSxiLm5hP3RoaXMuYmYoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIEgsTGI9Yy5Xa3x8TGIsTWI9bmV3IExiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jaj10aGlzLmFbMTBdO3RoaXMuWmk9dGhpcy5hWzRdOwp0aGlzLmJxPXRoaXMuYVs2XTt0aGlzLmdsPXRoaXMuYVszXTt0aGlzLllxPXRoaXMuYVs4XTt0aGlzLm5qPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3M9YjtiLnByb3RvdHlwZT17SGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLklqOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5aaTp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnE6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmdsOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ZcTp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLktzfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuSGooNCk7KGZ1bmN0aW9uKGMpe2MuYWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9ITE7Yj9iLkdldFZpZGVvRWw/Yi5HZXRFbD8oYT1iLkdldFZpZGVvRWwoKSxjPWIuR2V0RWwoKSxhJiZjPyh0aGlzLlcoYyksdGhpcy5aKGEpKTp0aGlzLmNhKCkpOnRoaXMuY2EoKTp0aGlzLmNhKCk6dGhpcy5jYSgpfSxmdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LEN4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuYWt8fE9iOyhmdW5jdGlvbihjKXtjLiRqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlM9dGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpezEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IiwKZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMub2EoKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIFBiPWMuJGp8fFBiOyhmdW5jdGlvbihjKXtjLmJrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7Ynx8KGI9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYiYmYi5HZXRBbGxQbGF5ZXJzJiYoYj1iLkdldEFsbFBsYXllcnMoKSkmJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm5hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5ia3x8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5SbT10aGlzLmFbNF07dGhpcy55dT10aGlzLmFbNF07dGhpcy50cz10aGlzLmFbMl07dGhpcy55aj10aGlzLmFbM107dGhpcy5Fcz10aGlzLmFbOF07dGhpcy5IcD10aGlzLmFbM107dGhpcy5qcj10aGlzLmFbNl07dGhpcy54bz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVsyXX1jLnRtPWI7Yi5wcm90b3R5cGU9e1FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5SbTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXU6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRzOnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55ajp0aGlzLkRzKGEpfSxEczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRXM6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhwOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuanI6dGhpcy53byhhKX0sd286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy50bXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMuUW0oNCk7KGZ1bmN0aW9uKGMpe2MuZm49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuVyhhKX1lbHNlIHRoaXMuY2EoKX0sCkxkOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSxPdDpmdW5jdGlvbigpe3RoaXMuUmQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe2lmKGIuZGV0YWlsKXtpZigiY29udGVudFBsYXllclBsYXkiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuUmQ9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX19LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBUYj1jLmZufHxUYjsoZnVuY3Rpb24oYyl7Yy5lbj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxTdDpmdW5jdGlvbihiKXtiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksCmIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpKTtiJiZiLmFkZEFkRXJyb3JMaXN0ZW5lciYmYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSl9LGFkOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpOwphLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sTmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0wO2I8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YisrKXRoaXMuYWQod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFtiXSk7dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk5mLmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuU3Qod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5OZigpO3RoaXMuUnQoKX0sUnQ6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLAp0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oKXt9KX0sbTpmdW5jdGlvbihiKXt0aGlzLk10P3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbigpe3RoaXMuTXQ9ITB9fSl9KShjKTt2YXIgVWI9Yy5lbnx8VWI7KGZ1bmN0aW9uKGMpe2MuZ249dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5PdCgpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7CnZhciBWYj1jLmdufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLkFwPXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzZdfWMud209YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk5tOnRoaXMuenAoYSl9LHpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5BcDp0aGlzLnFqKGEpfSxxajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLndtfHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy5NbSg0KTsKKGZ1bmN0aW9uKGMpe2MuSW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy53aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLkNzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxmdTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLAphPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMud2gmJih0aGlzLndoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy5JbXx8TzsoZnVuY3Rpb24oYyl7Yy5IbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnJ1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKaGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLkhtfHxQOyhmdW5jdGlvbihjKXtjLkptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuYmYoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLkptfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3Q9CnRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuY2s9YjtiLnByb3RvdHlwZT17RnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkd0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5ja3x8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnQoNCk7KGZ1bmN0aW9uKGMpe2MuTms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Naz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuYmgoKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnFiKCksITA7dGhpcy5UZysrO2lmKDEwPAp0aGlzLlRnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmguYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PQp0eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPwoodGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLk1rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Paz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsCnRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLk9rfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHY9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbN119Yy5rbD1iO2IucHJvdG90eXBlPXtrdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLmtsfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMua3YoNCk7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaGcoKX0sCmhnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5Xanx8ZWM7KGZ1bmN0aW9uKGMpe2MuWWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz0KbmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmx0PXRoaXMuYVs0XTt0aGlzLk1wPXRoaXMuYVsyXTt0aGlzLldzPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzVdfWMuVG09YjtiLnByb3RvdHlwZT17a3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmx0OnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NcDp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLldzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuVG18fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLmt0KDQpOyhmdW5jdGlvbihjKXtjLnBpPQpwLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5waXx8aWM7KGZ1bmN0aW9uKGMpe2Mub2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMub2l8fGpjOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj0KbmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMucml8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56bD10aGlzLmFbN107dGhpcy56aT10aGlzLmFbOV07dGhpcy5ubj10aGlzLmFbMTBdO3RoaXMuQXU9dGhpcy5hWzFdO3RoaXMuWHA9dGhpcy5hWzFdO3RoaXMucW49CnRoaXMuYVsyXTt0aGlzLlFpPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbNV07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5XaT1iO2IucHJvdG90eXBlPXt5bDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpsOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56aTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubm46dGhpcy56dShhKX0senU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF1OnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5YcDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucW46dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFpOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Zczp0aGlzLnFrKGEpfSxxazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucms6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5XaXx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMueWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZWg9dGhpcy5naD10aGlzLmZoPSExO3RoaXMueGQ9W107dGhpcy5hZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYj8KbnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZiP251bGw6ZmIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBFYj9udWxsOkViLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgemI/bnVsbDp6YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBsYz8KbnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuVGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5PcShhKTpbXSxiO3RoaXMuZ2g9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZmg9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuSGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmFmKXtpZih0aGlzLmVoKWJyZWFrO2I9dGhpcy5hZltjXTt0aGlzLnZmKGIpJiYodGhpcy54ZC5wdXNoKGIpLHRoaXMuSGgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxPcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSwKUHU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmZoKWZvcih0aGlzLmVoPSEwLGE9MDthPHRoaXMueGQubGVuZ3RoO2ErKyl0aGlzLnhkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGRbYV0uTGIpfX19KShjKTt2YXIgbmM9Yy5UbHx8bmMsTT1uZXcgbmM7TS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWW89dGhpcy5hWzldO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMucnc9dGhpcy5hWzFdO3RoaXMudm89dGhpcy5hWzEwXTt0aGlzLk12PXRoaXMuYVszXTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLlNvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzldfWMuS209YjtiLnByb3RvdHlwZT17WG86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLllvOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Obzp0aGlzLnF3KGEpfSwKcXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJ3OnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52bzp0aGlzLkx2KGEpfSxMdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk12OnRoaXMudXMoYSl9LHVzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52czp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYz1jLkttfHxvYyxhZD1uZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5Ybyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOgoiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQmMoay5FdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuQmMoay5JcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Yud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLApyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLllnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWWcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtJLmthKCk7dmFyIGNkPWJkKGZ1bmN0aW9uKCl7ZS55Zyh3aW5kb3csSS5FcigpLHtpZDpjZH0pfSw1MDApLGlhPWUuYWEoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenY9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMl19Yy5ibD1iO2IucHJvdG90eXBlPXt5djpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPWMuYmx8fHBjLGRkPW5ldyBwYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWRkLnl2KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy54aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMuc2Q9MDt0aGlzLmJiPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0saXU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxodTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oYSxiKXtlLmZhKCJ3ZWx0LmRlIikmJmUuYWIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5IcigpKXRoaXMubGIubCh0aGlzLmxiLm9kLHRoaXMubGIud2EsdGhpcy5sYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLkFjKTsKZWxzZSBpZih0aGlzLmFyKCkpdGhpcy5jdShmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudihrLnljLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3ICRhKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5SdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLm9iKCJuZXdIb21hZERpc3BsYXkiKTtSPWw9bmV3IFJhKGwsdGhpcy5sYixnKTtsLmd1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5tcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sCmcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuS2UoYSxjLGYpO3RoaXMucGxheWVyLkpoKGwpfX0sSHI6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxiPTA7aWYodGhpcy5zZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLnNkLmdldFRpbWUoKSx0aGlzLnNkPWEsM0U1PGI/ITA6ITE7dGhpcy5zZD1hO3JldHVybiExfSxFdTpmdW5jdGlvbigpe2Uub2IoInByZXJvbGwiKTtlLmZmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0sRHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7CmUub2IoInBvc3Ryb2xsIik7dGhpcy5udSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy51ZyhjKSk/dGhpcy5NYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxWdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnR1KHRoaXMuRHUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTsKaWYoIXRoaXMubWgpe3RoaXMubWg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuTWMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZGQsdGhpcy5wbGF5ZXIucygpKSl9fSxVdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLm11KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuRXUoKTt0aGlzLnBsYXllci5OZSYmdGhpcy5VdCgpO3RoaXMuVnQoKX0sV3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9CjA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMueWQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLkR3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy56ZD10aGlzLnlkLmxlbmd0aH0sYXI6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPHRoaXMuemQmJihhPSEwKTtyZXR1cm4gYX0sY3U6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLnh0LmJpbmQodGhpcykpfSx4dDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0sbXM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTsKcmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnNpfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFwPXRoaXMuYVsxXTt0aGlzLkt0PXRoaXMuYVs2XTt0aGlzLlVzPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMuVGk9YjtiLnByb3RvdHlwZT17UHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFwOnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlRpfHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9ZWQuUHAoNCl9KS5jYWxsKGthZWNoYWVNQW9sYWVidVosa2FlY2hhZU1Bb2xhZWJ1Wik7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.47.137 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.137.47.251.148.clients.your-server.de
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Mon, 07 Oct 2019 02:05:43 GMT
Server
cafe
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
image/gif
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache, must-revalidate
Access-Control-Allow-Credentials
true
X-Homad-Instance
de34-homad-4
X-Homad-Url
https://pubads.g.doubleclick.net/activity
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
42
Expires
Fri, 01 Jan 1990 00:00:00 GMT
5189757313
api.yieldlove-ad-serving.net/v1/bl/4444/
43 B
293 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5189757313
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
18.196.191.159 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-196-191-159.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
71e2001bf3c95766ba485062d952ec32467f930239f6ff724f7566311722118f

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Mon, 07 Oct 2019 02:05:25 GMT
Cache-control
public, max-age=604800
Connection
keep-alive
X-Key
/bl/4444/5189757313
Transfer-Encoding
chunked
Content-Type
application/json
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-2&screen=1200x1600&mbr=f6a5f661ec1b9b0662b946c7bcdf53f3&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=938961879716
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
63.32.86.220 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-32-86-220.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
d738772c0a424a490169895294555e3a43c3ba4a08e9a709c62ee6c391fe1091

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 07 Oct 2019 02:05:43 GMT
content-encoding
gzip
status
200
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
access-control-allow-origin
*
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
adrtxtag.min.js
cdn.adrtx.net/
840 B
848 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.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
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.250.43.132 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-250-43-132.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 16:53:59 GMT
Content-Encoding
gzip
Last-Modified
Mon, 23 Sep 2019 14:04:59 GMT
Server
akka-http/10.1.9
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
usersync
uss.xplosion.de/ Frame 282F
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBi_-Bsb8BsRCESUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4205968101957315115
42 B
660 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4205968101957315115
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
63.32.86.220 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-32-86-220.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Mon, 07 Oct 2019 02:05:43 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"

Redirect headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
server
nginx
status
307
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4205968101957315115
cache-control
no-store, no-cache, must-revalidate
access-control-allow-credentials
true
content-type
text/html; charset=utf-8
content-length
107
expires
0
activation
adstax-match.adrtx.net/ Frame B7FE
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: cdn.adrtx.net
URL: https://cdn.adrtx.net/adrtxtag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.248.95.73 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-248-95-73.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash

Request headers

Host
adstax-match.adrtx.net
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Mon, 07 Oct 2019 02:05:44 GMT
Server
akka-http/10.1.9
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
activeview
pagead2.googlesyndication.com/pcs/ Frame 194D
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsskhEwhGAEukyvWX93jZe0cVSnVWWYiJfUdtyxMTyv9L5tVyf8gp_ZSWyYK5z0qdU07qE_2bxriwlG9rQoxtcHL5h4GAjrPfebmXvRkGx8&sig=Cg0ArKJSzJJP9f3miUhyEAE&adk=3694558186&tt=681&bs=1585%2C1200&mtos=1007,1007,1007,1007,1007&tos=1007,0,0,0,0&p=278,968,528,1268&mcvt=1007&rs=3&ht=0&tfs=859&tls=1866&mc=1&lte=1&bas=0&bac=0&met=no&avms=nio&niot_obs=667&niot_cbk=747&md=2&lm=2&rst=1570413942777&rpt=138&isd=0&msd=0&oseid=3&xdi=0&ps=1585%2C6044&ss=1600%2C1200&pt=1186&bin=1&deb=1-2-7-14-15-44-107-13-0-0-0&tvt=1829&r=v&id=osdim&vs=4&za&uc=8&upc=1&tgt=DIV&cl=1&lop=1&tslp=717&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191004
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:825::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 194D
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssuRSnkoHRnvXiXi9kDR93fz6VZcn7w-gPm3JhGr0lkQwiBHY-rFtO9YptekxaH2nrtb0pbQdcpy7ksr1jMgrc&sig=Cg0ArKJSzNGfepOtRWVDEAE&adk=3694558186&tt=681&bs=1585%2C1200&mtos=1007,1007,1007,1007,1007&tos=1007,0,0,0,0&p=278,968,528,1268&mcvt=1007&rs=3&ht=0&tfs=859&tls=1866&mc=1&lte=1&bas=0&bac=0&met=no&avms=nio&niot_obs=667&niot_cbk=747&md=2&lm=2&rst=1570413942777&rpt=138&isd=0&msd=0&oseid=3&xdi=0&ps=1585%2C6044&ss=1600%2C1200&pt=1186&bin=1&deb=1-2-7-14-15-44-107-13-0-0-0&tvt=1829&r=v&id=osdim&vs=4&za&uc=8&upc=1&tgt=DIV&cl=1&lop=1&tslp=717&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191004
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:825::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:43 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
usersync
uss.xplosion.de/
42 B
660 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=f6a5f661ec1b9b0662b946c7bcdf53f3
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
63.32.86.220 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-32-86-220.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Mon, 07 Oct 2019 02:05:44 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
5180893370
api.yieldlove-ad-serving.net/v1/bl/4444/
44 B
294 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5180893370
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
18.196.191.159 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-196-191-159.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
b2a27a31e9d34704f0c2adae8a77ce35e0bc3c352a40a682d89783142780c2f7

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Mon, 07 Oct 2019 02:05:26 GMT
Cache-control
public, max-age=604800
Connection
keep-alive
X-Key
/bl/4444/5180893370
Transfer-Encoding
chunked
Content-Type
application/json
Cookie set showad.js
ads.pubmatic.com/AdServer/js/ Frame 59AA
0
0
Document
General
Full URL
https://ads.pubmatic.com/AdServer/js/showad.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.180 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-180.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) /
Resource Hash

Request headers

Host
ads.pubmatic.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
KTPCACOOKIE=YES; pi=156307:2; KADUSERCOOKIE=AC5FDE54-50FB-4796-B75B-4F13E9A3D118; chk=1; DPSync3=1571616000%3A201_197%7C1570492800%3A174; SyncRTB3=1572998400%3A203%7C1571011200%3A67_2_15%7C1571270400%3A63%7C1571616000%3A7_55_81_189_104_22_99_170_205_161_92_166_176_56_8_195_194_71_64_54_13_21_3_204_5; KRTBCOOKIE_27=16735-uid:26555d9a-9041-4400-aad3-81d33624c9d4&KRTB&16736-uid:26555d9a-9041-4400-aad3-81d33624c9d4; PUBMDCID=3; KRTBCOOKIE_1101=23040-6744876522074866902; KRTBCOOKIE_218=4056-XZqddwAAAEIjjkzT&KRTB&22922-XZqddwAAAEIjjkzT&KRTB&22978-XZqddwAAAEIjjkzT; KRTBCOOKIE_734=15208-uid:cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&KRTB&23151-uid:cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6; KRTBCOOKIE_188=3189-no-consent&KRTB&22716-no-consent; KRTBCOOKIE_80=16514-CAESEPGGWaUz92B5mc7wfy8oLS8&KRTB&22987-CAESEPGGWaUz92B5mc7wfy8oLS8&KRTB&22995-CAESEPGGWaUz92B5mc7wfy8oLS8; SPugT=1570413943; KRTBCOOKIE_153=19420-Ma3Fkz2ty8UpqMnKZ_nRljSoxcYp_ZqTYfveDWVq&KRTB&22979-Ma3Fkz2ty8UpqMnKZ_nRljSoxcYp_ZqTYfveDWVq; KRTBCOOKIE_1113=23098-02451279430389367; KRTBCOOKIE_22=14911-4339205254928204103&KRTB&16087-4339205254928204103&KRTB&23049-4339205254928204103&KRTB&23150-4339205254928204103; KRTBCOOKIE_699=22727-AAEunU67NTsAAD4Q0tn1oQ&KRTB&22744-AAEunU67NTsAAD4Q0tn1oQ&KRTB&22745-AAEunU67NTsAAD4Q0tn1oQ; KRTBCOOKIE_336=5844-8170736850644000593; KRTBCOOKIE_1051=22884-18072662388816846756; KRTBCOOKIE_594=17105-OPTOUT; KRTBCOOKIE_279=22890-f8578142-e8a6-11e9-be70-fda30ec8d161; PugT=1570413944
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Last-Modified
Fri, 26 Jul 2019 09:39:45 GMT
ETag
"13006b6-9bf6-58e925294ef26"
Server
Apache/2.2.15 (CentOS)
Set-Cookie
KTPCACOOKIE=YES; domain=.pubmatic.com; path=/; max-age=7776000;
Accept-Ranges
bytes
Content-Encoding
gzip
P3P
CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC", CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC"
Content-Length
14898
Content-Type
text/html; charset=UTF-8
Cache-Control
public, max-age=133873
Expires
Tue, 08 Oct 2019 15:16:59 GMT
Date
Mon, 07 Oct 2019 02:05:46 GMT
Connection
keep-alive
Vary
Accept-Encoding
index.html
cdn.districtm.io/ids/ Frame 56AC
0
0
Document
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 - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

:method
GET
:authority
cdn.districtm.io
:scheme
https
:path
/ids/index.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
__cfduid=d669dc85892a70bd1d6440e564486bd711570413942
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
date
Mon, 07 Oct 2019 02:05:46 GMT
content-type
text/html
last-modified
Thu, 10 Jan 2019 16:50:48 GMT
cache-control
s-maxage=1209600, max-age=14400
strict-transport-security
max-age=31536000; includeSubDomains; preload
cf-cache-status
DYNAMIC
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server
cloudflare
cf-ray
521c4fdcf8bfc281-FRA
content-encoding
br
usync.html
eus.rubiconproject.com/ Frame 89DA
0
0
Document
General
Full URL
https://eus.rubiconproject.com/usync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.78.125 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-78-125.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) / PHP/5.3.3
Resource Hash

Request headers

Host
eus.rubiconproject.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
rsid=1|BdCsOVsH/a/fRiqn0c18Mxvc5rJaP5uXhxptBfrzPAh1r4H5OGjlRsLybbqMiOGkSHO3tj2oYW2peUXLM3KhKxP1tUBJlFYZ4hQ5JcvaexNK8Cn3X/UNbPWpJKXQKV6YB7vxlRF/OivwyJA1Cf1tg/Usaek=; ses15=; vis15=156224^1; audit=1|hLZGFuTafB0r/DjTBC0KH+99qzxPzGzo9BApoNUbv8IQ6f6vGpJnbUaXUF0Dqvo9lVWZSWjC2ydZzHzbJL9ABaZr5ZVxLWDe; ses10=; vis10=156224^1; khaos=K1FRWX26-1I-3947; ses57=; vis57=156224^1
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
Apache/2.2.15 (CentOS)
X-Powered-By
PHP/5.3.3
p3p
CP="NOI CURa ADMa DEVa TAIa OUR # BUS IND UNI COM NAV INT"
Last-Modified
Thu, 03 Oct 2019 21:35:34 GMT
Content-Encoding
gzip
Content-Length
7651
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=46894
Expires
Mon, 07 Oct 2019 15:07:20 GMT
Date
Mon, 07 Oct 2019 02:05:46 GMT
Connection
keep-alive
Vary
Accept-Encoding
pd
eu-u.openx.net/w/1.0/ Frame BDFB
0
0
Document
General
Full URL
https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.163.0 /
Resource Hash

Request headers

:method
GET
:authority
eu-u.openx.net
:scheme
https
:path
/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
i=fe6fafe8-d25a-4928-bb2f-d6a2ab1ad696|1570413942; pd=v2|1570413942|mOkimWiygu
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
vary
Accept
set-cookie
i=fe6fafe8-d25a-4928-bb2f-d6a2ab1ad696|1570413942; Version=1; Expires=Tue, 06-Oct-2020 02:05:46 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1570413942.4|kimWiymOgu.fcgqsLn0oagi; Version=1; Expires=Tue, 22-Oct-2019 02:05:46 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.163.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Mon, 07 Oct 2019 02:05:46 GMT
content-type
text/html
content-length
478
via
1.1 google
alt-svc
clear
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame 9B4A
0
0
Document
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 - Fastly, US),
Reverse DNS
Software
nginx/1.9.13 /
Resource Hash

Request headers

Host
acdn.adnxs.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
icu=ChgI9apBEAoYASABKAEw-Lrq7AU4AUABSAEQ-Lrq7AUYAA..; uuid2=5753789694147878808
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
nginx/1.9.13
Content-Type
text/html
Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
W/"573e714d-3e3"
Expires
Sun, 06 Aug 2017 09:41:59 GMT
Cache-Control
max-age=31536000
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Via
1.1 varnish 1.1 varnish
Fastly-Debug-Digest
e0a1bb88354655bae6b4f44be1ff58238053e5563770e29e0e433e905ee66055
Content-Length
506
Accept-Ranges
bytes
Date
Mon, 07 Oct 2019 02:05:46 GMT
Age
5329431
Connection
keep-alive
X-Served-By
cache-jfk8123-JFK, cache-hhn4033-HHN
X-Cache
HIT, HIT
X-Cache-Hits
1276778, 4668086
X-Timer
S1570413946.418427,VS0,VE0
Vary
Accept-Encoding
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame 16C0
0
0
Document
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 - Fastly, US),
Reverse DNS
Software
nginx/1.9.13 /
Resource Hash

Request headers

Host
acdn.adnxs.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
icu=ChgI9apBEAoYASABKAEw-Lrq7AU4AUABSAEQ-Lrq7AUYAA..; uuid2=5753789694147878808
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
nginx/1.9.13
Content-Type
text/html
Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
W/"573e714d-3e3"
Expires
Sun, 06 Aug 2017 09:41:59 GMT
Cache-Control
max-age=31536000
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Via
1.1 varnish 1.1 varnish
Fastly-Debug-Digest
e0a1bb88354655bae6b4f44be1ff58238053e5563770e29e0e433e905ee66055
Content-Length
506
Accept-Ranges
bytes
Date
Mon, 07 Oct 2019 02:05:46 GMT
Age
5329431
Connection
keep-alive
X-Served-By
cache-jfk8123-JFK, cache-hhn4081-HHN
X-Cache
HIT, HIT
X-Cache-Hits
1276778, 4560465
X-Timer
S1570413946.419664,VS0,VE0
Vary
Accept-Encoding
data
lb67.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb67.s400.meetrics.net/data?/57lyFbOBA/k0FTImvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90A30Ax5Ay1AywAxmAjwFpkF9kElzFr0FvwFmhEwhF91Ax4A53A13AzxAzmAjpFk9BxzA4yA45A4zA22A00AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91Ax4A53A13AzxAzmAhwFk9B1xA45A31A3zAxzAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wA0xAz5A0yA2zAzmEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29BxyAz3Ay4A1zA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA4wA45AzzA3wAmjEpkF9xAz4Ay4A44Aw1Ax4A1mAzpF6lF9zAwwA4yB1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA4wA45AzzA3wAmhEwkF91Ax4Aw4A5zAz3AwmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wA0xAz5A0zAw5AwBELlnFCLl1FDLkqFKtkyB23A52AwwA6wEylF0pFtlF2qoFx1A3wA0xAz5A0xA20A5wAtyBwuExhF5zFxBEUkzF2BP+CAAAAAAABfgcAPAAAFAAfgcTbosAPAAAJPAWEABbosAZBAAOA55A55A85B55A58E55A55AGAxxA23A23ArbosAPXCAAZAwSAcAAAAPSAAJPAWEAHbosASksFhFjAAAAAAAAAAAAEAAAfgcAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA44A4wA1xA41AGAkpFylFj0FAAAAKAxyAz3Ay4A1zA31AKA1xA4wA45AzzA3wAJAylFj0FhuFnsFlBFKA1xA4wA45AzzA3wAKA1xA4wA45AzzA3wAzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAWEAsEA6DAFAAAbosAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjF+LH4WA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:47 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 07-Oct-19 02:05:46 GMT
sync
match.taboola.com/ Frame A9AB
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7fssCFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNVsMJsvJajmbQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfb5ZcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAFAfDue7Wl93ocH1edn8AADwEgAAADCiQAAzgNJUAVOQcnAAAAAAAAAAAsPz____HAOgRn8kAZCgN3hj0ADz4ADwIAQAAZA2dOzdvb1z71hAVJBYxAgAAAIBkavM4mtQJlUUVAABBuhXAFQBAQNvo_YVDlu6gxFsYAAAAwdgCPSx-v9lh1_jdLgMAAAAAAAAAMPs_-0cTIhpzSwtiKeBV-wUEAFj7BQQAYFM3AIC3ALigI2jFYLA6g5hsRrvJ7AAAAADu_v____VAZDmcmWyr2WazWQ5Xi83KY5m4Zh7bbORxTJzD2fZCYz9kw1VgYvpGhGX2-w4KyunpMbsMMpbLZFALZE2Ty28QHzQMy8kgmN-ELUaryWSzHM6Wi8lgOBqORvsTuNEAJ2g4HCx2g8VusRhOFpPRYDlYoEAMJjghw9FmshrtVrvJcjgZjWabyQYpWrWajTaD4Wo2me12q-FguByNkKI1i9lkspiNlrvNYDkZDYaT4RBhxuIcTCYT01rmWy3Xos1o5VaObLO1yrlZbIYL58i18KxFr4_ptBxNJjPbFgUDlPYiuEgnmtPl73JZ3pq3xa1z-hwWsURzskgnssu-shzOTLbVbLPZLIerxWblsUxcM49tNvI4Js7hbN-xOAeTycS0lvlWy7VoM1q5lSPbbK1ybhab4cI5ci08a9HrYzotR5PJzLZvrHaD0WKzHE32jdVuMFpslqPJvkNn-K4-Z6PyplV4hMbnM-U3zJwGhctg8f4kpsW0Ozt4fr-jU6W6aIwN2TehMBs8BoMilghOF-lE9DKeLmKJ5GmRTpSTxWDhWq6Wu-Fis9qsJovNaDMceRwmi2U0MWwmYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HhhiN5rrZXDFYzjWDVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HlQEkdgoA!&excid=22&docw=0&cijs=1
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_12/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash

Request headers

:method
GET
:authority
match.taboola.com
:scheme
https
:path
/sync?dast=V7fssCFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNVsMJsvJajmbQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfb5ZcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAFAfDue7Wl93ocH1edn8AADwEgAAADCiQAAzgNJUAVOQcnAAAAAAAAAAAsPz____HAOgRn8kAZCgN3hj0ADz4ADwIAQAAZA2dOzdvb1z71hAVJBYxAgAAAIBkavM4mtQJlUUVAABBuhXAFQBAQNvo_YVDlu6gxFsYAAAAwdgCPSx-v9lh1_jdLgMAAAAAAAAAMPs_-0cTIhpzSwtiKeBV-wUEAFj7BQQAYFM3AIC3ALigI2jFYLA6g5hsRrvJ7AAAAADu_v____VAZDmcmWyr2WazWQ5Xi83KY5m4Zh7bbORxTJzD2fZCYz9kw1VgYvpGhGX2-w4KyunpMbsMMpbLZFALZE2Ty28QHzQMy8kgmN-ELUaryWSzHM6Wi8lgOBqORvsTuNEAJ2g4HCx2g8VusRhOFpPRYDlYoEAMJjghw9FmshrtVrvJcjgZjWabyQYpWrWajTaD4Wo2me12q-FguByNkKI1i9lkspiNlrvNYDkZDYaT4RBhxuIcTCYT01rmWy3Xos1o5VaObLO1yrlZbIYL58i18KxFr4_ptBxNJjPbFgUDlPYiuEgnmtPl73JZ3pq3xa1z-hwWsURzskgnssu-shzOTLbVbLPZLIerxWblsUxcM49tNvI4Js7hbN-xOAeTycS0lvlWy7VoM1q5lSPbbK1ybhab4cI5ci08a9HrYzotR5PJzLZvrHaD0WKzHE32jdVuMFpslqPJvkNn-K4-Z6PyplV4hMbnM-U3zJwGhctg8f4kpsW0Ozt4fr-jU6W6aIwN2TehMBs8BoMilghOF-lE9DKeLmKJ5GmRTpSTxWDhWq6Wu-Fis9qsJovNaDMceRwmi2U0MWwmYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HhhiN5rrZXDFYzjWDVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HlQEkdgoA!&excid=22&docw=0&cijs=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx/1.13.12
content-type
text/html;charset=ISO-8859-1
machineid
402
accept-ranges
bytes
date
Mon, 07 Oct 2019 02:05:48 GMT
via
1.1 varnish
x-served-by
cache-hhn4061-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1570413948.253648,VS0,VE9
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__iz=0&__id=1570413952021&__it=-120&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
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

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 07 Oct 2019 02:05:51 GMT
Last-Modified
Tue, 29 Sep 2009 02:03:44 GMT
Server
X/1.0
Content-Type
image/gif
Cache-Control
private, no-cache, no-store, proxy-revalidate, no-transform
Connection
keep-alive
Content-Length
35
Expires
Mon, 01 Oct 2012 02:03:44 GMT
dc_oe=ChMIkard6YeJ5QIVhgrgCh2mFAtkEAAYACDWwpk6;met=1;&timestamp=1570413953090;eid1=871060;ecn1=1;etm1=0;eid2=2;ecn2=1;etm2=10;
ade.googlesyndication.com/ddm/activity/ Frame 194D
42 B
256 B
Image
General
Full URL
https://ade.googlesyndication.com/ddm/activity/dc_oe=ChMIkard6YeJ5QIVhgrgCh2mFAtkEAAYACDWwpk6;met=1;&timestamp=1570413953090;eid1=871060;ecn1=1;etm1=0;eid2=2;ecn2=1;etm2=10;
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.207.34 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s24-in-f2.1e100.net
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 07 Oct 2019 02:05:53 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
sync
match.taboola.com/ Frame 0D32
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7fssCFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNVsMJsvJajmbQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfb5ZcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAFAfDue7Wl93ocH1edn8AADwEgAAADCiQAAzgNJUAVOQcnAAAAAAAAAAAsPz____HAOgRn8kAZCgN3hj0ADz4ADwIAQAAZA2dOzdvb1z71hAVJBYxAgAAAIBkavM4mtQJlUUVAABBuhXAFQBAQNvo_YVDlu6gxFsYAAAAwdgCPSx-v9lh1_jdLgMAAAAAAAAAMPs_-0cTIhpzSwtiKeBV-wUEAFj7BQQAYFM3AIC3ALigI2jFYLA6g5hsRrvJ7AAAAADu_v____VAZDmcmWyr2WazWQ5Xi83KY5m4Zh7bbORxTJzD2fZCYz9kw1VgYvpGhGX2-w4KyunpMbsMMpbLZFALZE2Ty28QHzQMy8kgmN-ELUaryWSzHM6Wi8lgOBqORvsTuNEAJ2g4HCx2g8VusRhOFpPRYDlYoEAMJjghw9FmshrtVrvJcjgZjWabyQYpWrWajTaD4Wo2me12q-FguByNkKI1i9lkspiNlrvNYDkZDYaT4RBhxuIcTCYT01rmWy3Xos1o5VaObLO1yrlZbIYL58i18KxFr4_ptBxNJjPbFgUDlPYiuEgnmtPl73JZ3pq3xa1z-hwWsURzskgnssu-shzOTLbVbLPZLIerxWblsUxcM49tNvI4Js7hbN-xOAeTycS0lvlWy7VoM1q5lSPbbK1ybhab4cI5ci08a9HrYzotR5PJzLZvrHaD0WKzHE32jdVuMFpslqPJvkNn-K4-Z6PyplV4hMbnM-U3zJwGhctg8f4kpsW0Ozt4fr-jU6W6aIwN2TehMBs8BoMilghOF-lE9DKeLmKJ5GmRTpSTxWDhWq6Wu-Fis9qsJovNaDMceRwmi2U0MWwmYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HhhiN5rrZXDFYzjWDVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HlQEkdgoA!&excid=22&docw=0&cijs=1
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_12/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash

Request headers

:method
GET
:authority
match.taboola.com
:scheme
https
:path
/sync?dast=V7fssCFgPsFdt9mh3sjATsFdt9mh3sjAUAAAAGBvQHGsEiTJYLFm9CGQ1Xq9VwNVsMJsvJajmbQoixXCaDWiBhmf2-g4JyenrMLoOM5TIZ1AJZ0-Tyu-ELTafD57rX636_u87pc9hFLr_uZXEYDp-_4OE8PMx-0dNw-PwFD-fhYXaL_T6n3a35u3Uuo-nzVt1Nbs3fLfa7PKe30mh5i_0-p90tuPwtZpfb5ZcDAAAAwAOAUmE_xA8gAEAEAAAAgAQAAAAARUDFv4XABQAAAAAGQAHWjwYAFAfDue7Wl93ocH1edn8AADwEgAAADCiQAAzgNJUAVOQcnAAAAAAAAAAAsPz____HAOgRn8kAZCgN3hj0ADz4ADwIAQAAZA2dOzdvb1z71hAVJBYxAgAAAIBkavM4mtQJlUUVAABBuhXAFQBAQNvo_YVDlu6gxFsYAAAAwdgCPSx-v9lh1_jdLgMAAAAAAAAAMPs_-0cTIhpzSwtiKeBV-wUEAFj7BQQAYFM3AIC3ALigI2jFYLA6g5hsRrvJ7AAAAADu_v____VAZDmcmWyr2WazWQ5Xi83KY5m4Zh7bbORxTJzD2fZCYz9kw1VgYvpGhGX2-w4KyunpMbsMMpbLZFALZE2Ty28QHzQMy8kgmN-ELUaryWSzHM6Wi8lgOBqORvsTuNEAJ2g4HCx2g8VusRhOFpPRYDlYoEAMJjghw9FmshrtVrvJcjgZjWabyQYpWrWajTaD4Wo2me12q-FguByNkKI1i9lkspiNlrvNYDkZDYaT4RBhxuIcTCYT01rmWy3Xos1o5VaObLO1yrlZbIYL58i18KxFr4_ptBxNJjPbFgUDlPYiuEgnmtPl73JZ3pq3xa1z-hwWsURzskgnssu-shzOTLbVbLPZLIerxWblsUxcM49tNvI4Js7hbN-xOAeTycS0lvlWy7VoM1q5lSPbbK1ybhab4cI5ci08a9HrYzotR5PJzLZvrHaD0WKzHE32jdVuMFpslqPJvkNn-K4-Z6PyplV4hMbnM-U3zJwGhctg8f4kpsW0Ozt4fr-jU6W6aIwN2TehMBs8BoMilghOF-lE9DKeLmKJ5GmRTpSTxWDhWq6Wu-Fis9qsJovNaDMceRwmi2U0MWwmYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HhhiN5rrZXDFYzjWDVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HlQEkdgoA!&excid=22&docw=0&cijs=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx/1.13.12
content-type
text/html;charset=ISO-8859-1
machineid
3404
accept-ranges
bytes
date
Mon, 07 Oct 2019 02:05:53 GMT
via
1.1 varnish
x-served-by
cache-hhn4061-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1570413953.274987,VS0,VE9

Verdicts & Comments Add Verdict or Comment

322 JavaScript Global Variables

These are the non-standard "global" variables defined on the window object. These can be helpful in identifying possible client-side frameworks and code.

object| onformdata object| onpointerrawupdate object| smbContext object| LUX object| POST_META object| smbt function| b2serp object| smbadloader function| requirejs function| require function| define string| GoogleAnalyticsObject function| ga function| adLoader object| apstag boolean| smbt_only object| DKUIM_SETTINGS string| GIGA_AREA string| WP_SITEURL string| SHUTTLE_CORE_VIDEO_CDN_VIDEO_URL string| SHUTTLE_API_URL string| VIDEO_INLINE_MODE boolean| VIDEO_AUTOPLAY_DISABLED function| st_cookie object| is number| USER_PAGE_COUNT number| LUX_t_start number| LUX_t_end object| gaLog string| szmvars object| iom object| smbVideoService object| iam_data object| pagespeed object| adsbygoogle object| google_js_reporting_queue number| google_srt object| google_ad_modifications object| google_logging_queue object| ggeac boolean| google_measure_js_timing object| googleToken object| googleIMState function| processGoogleToken object| google_reactive_ads_global_state boolean| _gfp_a_ object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad boolean| _gfp_p_ function| google_spfd number| google_lpabyc number| google_unique_id object| google_sv_map object| google_t12n_vars string| type function| sdibgclick object| _absconfig object| _ecoconf function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam function| setUpAgknTag object| google_tag_data object| gaplugins object| gaGlobal object| gaData object| dataLayer function| setImmediate function| clearImmediate boolean| apstagLOADED object| nativendo_588f272a3e49c_conf function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| __google_ad_urls number| google_global_correlator number| __google_ad_urls_id object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy boolean| google_osd_loaded boolean| google_onload_fired object| _econa function| send function| _ object| google_tag_manager object| _taboola object| closure_memoize_cache_ object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| core function| pbjsYLHHChunk object| google_optimize function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb function| dummy function| log function| debug function| info function| warn function| error object| nativendo_pc function| NativendoV2 object| NativendoV2Loader object| nativendo object| nativendo_588f272a3e49c object| TRC object| _tblConsole undefined| msg object| _comscore boolean| google_noFetch object| gapi object| ___jsl function| webpackJsonpdkuim object| Base64 boolean| dkuimInited object| de_meetrics function| $ function| jQuery function| isEmpty object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| _m6rq string| preloadType object| stroeerCore object| confiant function| __trcCopyProps function| __trcFromError function| __trcClientTimestamp function| __trcLog function| __trcError function| __trcDebug function| __trcInfo function| __trcWarn function| __trcDOMWalker function| __trcPurgeEventHandlers function| __trcJSONify function| __trcUnJSONify function| __trcGetMargins function| __trcAttachResize function| __trcDetachResize function| __trcTrim function| __trcGetElementsByClass function| __trcToArray function| __trcObjectCreate function| PageManager function| addHashParam object| params number| trc_debug_level string| trc_article_id object| TRCImpl number| taboola_view_id function| udm_ object| ns_p object| COMSCORE string| sdm_ift function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet number| _m6rApiLoaded object| trcManager object| trcRbox object| options object| nativendo_588f272a3e49c_map object| cmTag object| containers object| images function| startCMTagMain function| stroeerCoreConnect object| teadsscript object| teads object| cp2 boolean| isCmTagFMOnPage string| category function| shuffle object| arrToUse object| travel object| news object| mobilecontent1 object| mobilecontent1_new object| travelmuted object| movietrailersHD object| movietrailersHDmuted object| widescreen object| movietrailerslight object| landscapeHD object| landscapeHDmuted object| blank object| blankblack object| blankblack7 object| blankblack5 object| blankblack_mob object| blankwhiteHDmpg object| blankblack10 object| blankwhite object| blankwhiteHD object| black_loader object| lightweight object| lightweight_single object| lightweight300600 object| bonnier object| home object| lipstick object| shoes object| art object| infiltrator object| glass object| lemurs object| NBAshoes object| Sunglasses object| Hummus object| Short_food object| Short_swim object| Euro_news object| Automoto_TV object| Uzoo object| SmartDuvet object| Tiger object| Chocolate object| Logan object| Jacket object| Bike object| Kanye object| Cancun object| Smartwatch object| Helicopter object| dogshampoo object| icetea object| charger object| blueysmoothie object| ShortContent object| carbsandwich object| pisatower object| Food1 object| Food2 object| Food3 object| Food4 object| Food5 object| Food6 object| Food7 object| Fashion object| Lifestyle1 object| Lifestyle2 object| Technology1 object| Technology2 object| Technology3 object| Entertainment object| Scrambledeggs object| Spinach object| Bub1 object| Pokemon object| style_hacks object| Motorcycle object| IceCracking object| Manatees object| Daiving object| Fishing_Lure object| Shark object| HundredsManatees object| TigerShark object| MandelaPrize object| Bertram35 object| bushfire object| Snow object| Delta object| Wheels object| Yellowfin object| Grip object| Kawasaki object| Yoga object| Cat object| Chickens object| RZR object| bitcoin object| bmw object| wombat object| koala object| Marsupial object| puppy object| bitcoinMuted object| bmwMuted object| Wallabies object| Bunny object| Pumpkins object| Dogs_Stress object| Dogs_Stress_image object| lightweight300600_short object| playlist function| webpackHotUpdate string| vpaidId function| OvaMediaPlayer object| Adform function| _h object| _adexc object| adex object| ibb_lib object| _EQLService object| _EQPScript object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr

69 Cookies

Domain/Path Name / Value
.bidswitch.net/ Name: tuuid
Value: 45c3066d-0d0a-47c3-b958-7454d059a5f1
.openx.net/ Name: i
Value: fe6fafe8-d25a-4928-bb2f-d6a2ab1ad696|1570413942
.pubmatic.com/ Name: KRTBCOOKIE_699
Value: 22727-AAEunU67NTsAAD4Q0tn1oQ&KRTB&22744-AAEunU67NTsAAD4Q0tn1oQ&KRTB&22745-AAEunU67NTsAAD4Q0tn1oQ
.pubmatic.com/ Name: KRTBCOOKIE_153
Value: 19420-Ma3Fkz2ty8UpqMnKZ_nRljSoxcYp_ZqTYfveDWVq&KRTB&22979-Ma3Fkz2ty8UpqMnKZ_nRljSoxcYp_ZqTYfveDWVq
.pubmatic.com/ Name: SPugT
Value: 1570413943
.pubmatic.com/ Name: KRTBCOOKIE_80
Value: 16514-CAESEPGGWaUz92B5mc7wfy8oLS8&KRTB&22987-CAESEPGGWaUz92B5mc7wfy8oLS8&KRTB&22995-CAESEPGGWaUz92B5mc7wfy8oLS8
.pubmatic.com/ Name: KRTBCOOKIE_188
Value: 3189-no-consent&KRTB&22716-no-consent
.pubmatic.com/ Name: KRTBCOOKIE_734
Value: 15208-uid:cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6&KRTB&23151-uid:cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6
.pubmatic.com/ Name: KRTBCOOKIE_218
Value: 4056-XZqddwAAAEIjjkzT&KRTB&22922-XZqddwAAAEIjjkzT&KRTB&22978-XZqddwAAAEIjjkzT
.simpli.fi/ Name: uid
Value: n/2At12anXek8K2hh7bNAg==
.pubmatic.com/ Name: KRTBCOOKIE_1101
Value: 23040-6744876522074866902
.pubmatic.com/ Name: PugT
Value: 1570413943
.pubmatic.com/ Name: DPSync3
Value: 1571616000%3A201_197%7C1570492800%3A174
.adnxs.com/ Name: uuid2
Value: 5753789694147878808
.pubmatic.com/ Name: KADUSERCOOKIE
Value: AC5FDE54-50FB-4796-B75B-4F13E9A3D118
.teads.tv/ Name: tt_dar
Value:
.pubmatic.com/ Name: KRTBCOOKIE_1113
Value: 23098-02451279430389367
.giga.de/ Name: ioam2018
Value: 0011028c08bbd87495d9a9d75:1599617141833:1570413941833:.giga.de:2:giga:software_content:noevent:1570413941833:xlnt78
.pubmatic.com/ Name: SyncRTB3
Value: 1572998400%3A203%7C1571011200%3A67_2_15%7C1571270400%3A63%7C1571616000%3A7_55_81_189_104_22_99_170_205_161_92_166_176_56_8_195_194_71_64_54_13_21_3_204_5
.teads.tv/ Name: tt_neustar
Value:
.ads.pubmatic.com/ Name: KCCH
Value: YES
.bidswitch.net/ Name: tuuid_lu
Value: 1570413942
.teads.tv/ Name: tt_viewer
Value: 7252c22a-2ab3-40ee-83e3-45ba953274cb
.adscale.de/ Name: ng
Value: 2#2300827882#26173565#0#d3~4&d1~1&d10~3&d9~2&d4~1&d7~2&d2~3&d11~3&d12~2&d8~2
.adscale.de/ Name: uu
Value: e265b4ffd16840849bb797d943145325
.giga.de/ Name: _gat_gt1
Value: 1
.giga.de/ Name: _gid
Value: GA1.2.161904196.1570413942
.taboola.com/ Name: t_gid
Value: cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6
.pubmatic.com/ Name: KRTBCOOKIE_27
Value: 16735-uid:26555d9a-9041-4400-aad3-81d33624c9d4&KRTB&16736-uid:26555d9a-9041-4400-aad3-81d33624c9d4
.adfarm1.adition.com/ Name: UserID1
Value: 6744876522074866902
.amazon-adsystem.com/ Name: ad-id
Value: A0vEJSYIakRRlvXJQ9w01c0
.agkn.com/ Name: ab
Value: 0001%3ALFJZIAOD%2FCQfAOwmm%2FzzLW2dnysm5vPU4Loljjv9Sp3WOpw1sCGzDw%3D%3D
.agkn.com/ Name: u
Value: C|0AEAlLVn2JS1Z9gAAAAAAAg1RAQCADVIBAIA
.teads.tv/ Name: tt_salesforce
Value:
.pubmatic.com/ Name: chk
Value: 1
.m6r.eu/ Name: test
Value: true
.m6r.eu/ Name: adscale
Value: 2019-10-07T02%3A05%3A42.042Z
.amazon-adsystem.com/ Name: ad-privacy
Value: 0
.pubmatic.com/ Name: KRTBCOOKIE_22
Value: 14911-4339205254928204103&KRTB&16087-4339205254928204103&KRTB&23049-4339205254928204103&KRTB&23150-4339205254928204103
.doubleclick.net/ Name: IDE
Value: AHWqTUkBHw18OYZ19SDi_Tq9RJMESDAG-SeHkKLwVZDX4uvDG9WwJ1nlyZzClBa0
.m6r.eu/ Name: appnexus
Value: 2019-10-07T02%3A05%3A42.000Z
.adnxs.com/ Name: icu
Value: ChgI9apBEAoYASABKAEw-Lrq7AU4AUABSAEQ-Lrq7AUYAA..
.ih.adscale.de/ Name: tu
Value: 4#1494732448#48~f6a5f661ec1b9b0662b946c7bcdf53f3~436226~0~0#101~~436226~436226~1#38~CAESEAxLj_nd03A4MFVMPOwzA8o~436226~0~0#39~26555d9a-9041-4400-aad3-81d33624c9d4~436226~0~0#40~4340a82e-4d47-4a02-a94b-ac20b6ff8667~436226~0~0#72~6744876522074866902~436226~0~0#42~3363664383570564462~436226~0~0#75~~436226~436226~1#63~XZqddrlQJsMAABOGr5EAAAA7&1110~436226~0~0
.m6r.eu/ Name: yieldlab
Value: 2019-10-07T02%3A05%3A41.999Z
.bidswitch.net/ Name: c
Value: 1570413942
www.giga.de/ Name: smb-session
Value: direct-1-default
.doubleclick.net/ Name: DSID
Value: NO_DATA
.pubmatic.com/ Name: PUBMDCID
Value: 3
www.giga.de/ Name: smbVideoStickyAutoplay-GIGA
Value: 91
.teads.tv/ Name: tt_bluekai
Value:
www.giga.de/ Name: AWSELB
Value: E3417B491473CBC1A013199F961D4B7989B16A0E783847BDDA9E5ECC978319D414C32B66989097610EE27A8B5DECF6E3CAAD4AFA023933897BE8BC091DB541E02F7BF18237
.teads.tv/ Name: tt_emetriq
Value:
.giga.de/ Name: __gads
Value: ID=f66eee15fc5baddd:T=1570413942:S=ALNI_MYpA8Ts8nN8gzKiBntqKFKcpqVCYQ
.teads.tv/ Name: tt_exelate
Value:
.pubmatic.com/ Name: pi
Value: 156307:2
www.giga.de/ Name: session_id
Value: 29ba1f4c-d8d8-4537-a082-65b4149ca5b3
.m6r.eu/ Name: adx
Value: 2019-10-07T02%3A05%3A42.032Z
www.giga.de/ Name: trc_cookie_storage
Value: stroeer-smb-giga%253Asession-data%3Dv2_298fd65633398513ec2b5fc66dc1b986_cb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6_1570413942_1570413942_CNawjgYQrMVBGPqs3J_aLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA%7Ctaboola%2520global%253Alocal-storage-keys%3D%255B%2522stroeer-smb-giga%253Asession-data%2522%252C%2522taboola%2520global%253Alspb%2522%252C%2522taboola%2520global%253Auser-id%2522%255D%7Ctaboola%2520global%253Alspb%3DCwsIQhDdnDkMCwiJARDdnDkMCwhMEN2cOQwLCCAQ3Zw5DAsIJBDdnDkMCwhkEN2cOQwLCCcQ3Zw5DAsILRDdnDkMCwg7EN2cOQwLCD0Q_c04DAsIPxDdnDkMDBMU%7Ctaboola%2520global%253Auser-id%3Dcb9022b4-f759-434e-9d66-e93138a9d5a3-tuct49422f6
.teads.tv/ Name: tt_liveramp
Value:
www.giga.de/ Name: _econa
Value: d60947d71dc6b8363d958031bdb4812c
.adfarm1.adition.com/ Name: lv_3368837
Value: w=3957067|t=1570413941
.adform.net/ Name: uid
Value: 3363664383570564462
.giga.de/ Name: pc
Value: 1
.pubmatic.com/ Name: KTPCACOOKIE
Value: YES
.openx.net/ Name: pd
Value: v2|1570413942|mOkimWiygu
www.giga.de/ Name: POPUPCHECK
Value: 1570500341833
www.giga.de/ Name: lux_uid
Value: 157041394182398938
.giga.de/ Name: _ga
Value: GA1.2.1229370929.1570413942
.m6r.eu/ Name: id
Value: f6a5f661ec1b9b0662b946c7bcdf53f3

7 Console Messages

Source Level URL
Text
console-api log URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
starting version 20181002
console-api error URL: https://c.amazon-adsystem.com/aax2/apstag.js(Line 2)
Message:
Error: `apstag.init` was called multiple times with different pubIDs (3301 then 3301)
console-api log URL: https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js(Line 1)
Message:
SDG: ERROR: MEETRICS: OUT-OF-PAGE: minimal information not met. Measurement canceled
console-api log URL: https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js(Line 1)
Message:
SDG: ERROR: MEETRICS: SKY: minimal information not met. Measurement canceled
console-api log URL: https://js.stroeermediabrands.de/metaTag.min.26390daed7ddbfb83c0ac952dc858f5c.js(Line 1)
Message:
SDG: ERROR: MEETRICS: POSTERAD: minimal information not met. Measurement canceled
console-api log (Line 108)
Message:
inline_ad: No video available; loading inline-ad by Teads
console-api info URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
got title from meta

Indicators

This is a term in the security industry to describe indicators such as IPs, Domains, Hashes, etc. This does not imply that any of these indicate malicious activity.

15.taboola.com
a.teads.tv
aax-eu.amazon-adsystem.com
acdn.adnxs.com
ad.doubleclick.net
ad2.adfarm1.adition.com
ade.googlesyndication.com
ads.pubmatic.com
adserver-eu.adtech.advertising.com
adserver.adtech.de
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
adx.adform.net
ajax.googleapis.com
api.theadex.com
api.yieldlove-ad-serving.net
apis.google.com
as-sec.casalemedia.com
bbcdn-bbnaut.ibillboard.com
bttrack.com
c.amazon-adsystem.com
c.nativendo.de
cdn-a.yieldlove.com
cdn.adrtx.net
cdn.districtm.io
cdn.emetriq.de
cdn.m6r.eu
cdn.speedcurve.com
cdn.stroeerdigitalmedia.de
cdn.taboola.com
cds.taboola.com
cm.g.doubleclick.net
cmp.teads.mgr.consensu.org
confiant-integrations.global.ssl.fastly.net
convammp.taboola.com
crops.giga.de
d.agkn.com
d.nativendo.de
de-gmtdmp.mookie1.com
de.ioam.de
dkuim.de
dmp.theadex.com
dmx.districtm.io
eu-u.openx.net
eus.rubiconproject.com
fastlane.rubiconproject.com
files.giga-video.de
go.giga-abs.de
gocp.stroeermediabrands.de
googleads.g.doubleclick.net
googleads4.g.doubleclick.net
hbopenbid.pubmatic.com
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
imprammp.taboola.com
irqs.ioam.de
js.adscale.de
js.agkn.com
js.stroeermediabrands.de
lb67.s400.meetrics.net
match.adsrvr.org
match.taboola.com
maxcdn.bootstrapcdn.com
media.oadts.com
native.adscale.de
nugmw.userreport.com
orbidder.otto.de
p.rfihub.com
pagead2.googlesyndication.com
pixel.consentric.de
pixel.rubiconproject.com
prg.smartadserver.com
px.powerlinks.com
rtb.mfadsrvr.com
s0.2mdn.net
s3.eu-central-1.amazonaws.com
s400.mxcdn.net
sb.scorecardresearch.com
script.ioam.de
securepubads.g.doubleclick.net
si.nuggad.net
ssl-econa.met.vgwort.de
ssl.1.damoh.giga.de
static.giga.de
sync.teads.tv
t.nativendo.de
t.teads.tv
tpc.googlesyndication.com
track.adform.net
tracker-adserver.ibillboard.com
tracking.m6r.eu
trc.taboola.com
ups.xplosion.de
uss.xplosion.de
video-adserver.ibillboard.com
videos.giga.de
vidstat.taboola.com
www.dunkirkinception.com
www.facebook.com
www.giga.de
www.google-analytics.com
www.googletagservices.com
www.storygize.net
x.bidswitch.net
xpl.theadex.com
yieldlove-d.openx.net
104.109.78.125
104.109.82.87
104.111.214.103
104.111.246.233
104.16.68.69
107.178.241.34
109.71.25.30
13.224.196.127
13.225.78.101
130.211.13.252
136.243.4.7
148.251.47.137
151.101.113.108
151.101.114.2
151.101.114.49
151.101.13.194
151.101.14.217
151.101.14.49
152.199.22.2
152.199.22.24
161.156.66.178
172.217.16.162
172.217.21.230
178.19.65.130
178.19.70.100
178.19.72.10
178.19.72.20
18.185.154.43
18.196.191.159
185.22.221.117
185.31.128.129
185.64.189.112
185.86.138.16
188.40.16.106
192.132.33.46
193.46.63.75
2.18.232.7
2.18.233.180
2.18.233.67
2.18.234.21
2.18.234.72
2001:4de0:ac19::1:b:1a
216.58.207.34
216.58.207.66
217.79.188.21
2600:9000:2043:dc00:15:efbc:e300:93a1
2600:9000:20eb:6800:1c:8c89:a300:93a1
2600:9000:21f3:9600:1f:a1b:34c0:93a1
2600:9000:21f3:dc00:12:6213:9cc0:93a1
2606:4700:20::6819:ac0d
2a00:1450:4001:800::2006
2a00:1450:4001:809::2001
2a00:1450:4001:80b::200a
2a00:1450:4001:814::200e
2a00:1450:4001:815::2002
2a00:1450:4001:817::2002
2a00:1450:4001:817::200a
2a00:1450:4001:81f::200e
2a00:1450:4001:825::2002
2a02:26f0:6c00:18a::5f76
2a02:26f0:6c00:292::2c92
2a03:2880:f12d:83:face:b00c:0:25de
3.121.36.175
34.248.95.73
34.250.43.132
34.95.120.147
35.156.29.62
35.165.120.69
35.186.238.175
35.206.134.202
37.157.6.246
37.252.173.22
40.113.136.100
46.253.113.178
52.219.74.191
52.29.161.247
52.94.220.16
54.192.201.129
62.138.221.190
62.168.44.119
62.168.44.126
63.32.86.220
63.34.164.219
69.173.144.136
69.173.144.142
85.114.144.106
89.163.159.102
91.215.100.39
91.215.100.40
00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
01295ef44ccf7fdfaea9e0be7cc992544e0680b5fa8275ebc6b985734f89e867
01bd64076f129e4393e7cc464ae93d4ab379bdd8b814e195b75711315ebc3b4c
03cdd154a67240548616e679dde7dd00a53bbfb48697a1635bafef7fd09406c4
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
04b63a4700b9d80a8cf18c7990b705e364ea48c31f5a47a5a8e0d473ca7f2e94
04c7251dca0914d9d5f9c3984afde3b0d28aebb1fcd83d17fe4e758445a4c396
0cae80c9382e2b3e8045ba09797fd66d1a65a936d70af2eed09897be81ea436e
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603
0e48469ab130cace92f9adc56bd1e4179e7f6ac6c35f1b685444c3eee1e78645
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499
0f50fc22b5e00415e92e4737ee79ae6fa96b9f5e52bb0aa5e50a14d1b8f25740
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
141d3097b12df4553fb3cc1bd69ab02a93b3dd12c269ea5bebd48ae96dffa8b8
1939dfe9d1326251c0ed05efa9f0a4331fe718e9c3c4bdb2d4070016ca1a06b8
1a560979c35508f894818e1f68012f0a56d6a6001c5dfb73ffeda325fcbafbeb
1b35bd23206a199b500fdb41aa9dd3ddedb9cbfdd2f1b1da79c5a3f916e737e5
1d79549e195135a533efe5e9c4e19d44cd999283045607304a34ab122676d1ae
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
257280261952cc16f2188219f80c334cd855a9188a26147802509493ae809b38
25cefebe6cf8e9964f288373af5d6d01c480f3c9264ff6fce1be97dc0e1e2528
25d238eac82235b53958982f2d7c8db542d0c4b05ed49ccc8cfd9d1d56f38760
265de6b562fdaf225b6713104b74342ffe97177ac67505d9e799e3acfa56352b
2781ecf5c51fdc9300e6859e23f72b013b66bae2987f54b8c216f2f04f24a757
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
2bae0748e26a313aa1aec60fd0d907e4c974a1e5e38c120401c836534771dd6f
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
2f58ccf14355919dfa5815bebd82d775161bdf2707480201bd8b2334778c0412
31a7a492b370d48d381afdb515ae3fa6cc0fc724d6fbbffec1cbaa1128bfae45
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7
3324b91c39d6416dd224d4cbc6334c81db1da0e210fcbe1887208270c7df2771
3410066bc879980f292295a5e7752eaffafbdb16ee4f4201677731a90290f07b
35637b2df493cc121a7ffc815aa9fadf81ae3f0199e524af5ebe73c7f254e3b7
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618
3abcb6200574ebc02b948e70b0cd405539ed5b7658962fb9874b7ad0e0b91ffd
3c6a050e6d0da4731ca515e80879208d7415df609352addccd6b58f3d02b841a
3cddc2e86e4eb1938c7839c370626f1d75ce9308959399c7956b5ea9c2a7d334
3dba93f65c632536a0fcba4dff71f82f7d6ae88b3a2814d82a1b1876558d79c1
40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
4330193cc2f6442925c50f1f9c9bf19ed4fe8a23012bbbdfe0e5626453809eeb
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4a355c03b8f32674c198142853d19219d34781b48596907e9a333e5e4c984f08
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
4f9a3ab1fb44278cb1ab0148d38cf2270ac083df68454ed2feae820f41b984c5
5056305b09ad6474ea540f796c79be51d6b8e96043cb3d7bc4ef774e56765f4f
5212afd7eaaffe21e9ecac742a18d98c85b513df6c4c3d5243a4fe8623c61c60
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef
54437e58b6b6163e80d3b0d4f6858d329375a3149ad045f9297dfa85a9302876
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
54eec5ed620afaf557024bc80f5fc58c0ffa5777a8a6cf77566da8d811ca4818
5aeb54f6727af87431148b611f64c2d9608b22f49b71cd313f5e023b0f6ee642
5dbbdc8fcb6ffca57165278f6620f2587433608ff9b0fe88c646a8421b6f010d
5dc42893eef87553d41f353899f7cb93675cd4cf9f4f6f1fc8abbeecc83c73d1
5e418cb008b2f71199f6f58b8fd1449d668c9a17ec0049a6e31b0dacb4c98757
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda
62c1ac325eb3e990344d5db97c6dfee86c08f386bdf77cd6e29be7b9fe9d9d52
631bc9fa39ddcdd4008398e649671ba79db3cc7c1725d7b8cd9823ec243f0a48
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e
6eeaa330e79de82579d573d85b1e62ee0017782c71406518af6b366b78c7981e
6f93b77ac6c571e0ea75a8c144ad98e4723264e1da2d3b49ae0c287dfc1688e1
70072788613bde80533a3cb95d5a16c924011004b1d861093610379370beb859
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
71e2001bf3c95766ba485062d952ec32467f930239f6ff724f7566311722118f
723f8c921ee466a6016d6d75249bb18a558e18860931d094e5dd88bca235af95
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
761e92a356ff5bc6f216340957f2c95665ac5b58be82fdd74bb0b9d5b96e6e8a
76c393f564f53c19e795307e622edc8657a603f7a816c2646385697286d11313
76d0d32ecf3e068833862d36267bb22f983440a9e102e8411819f0f97360da56
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
785c06447334e88d0142b9b9bde0ce6ed34b903e8d545dcb3e5822b8b82f0288
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
7bb26081338c7d955ee50e9699beec73ddd139fc805b3e37385462cc8230d45d
7f8d27dea05cdff3224bb6a4795cd38f63cc7eab46d8fdd08a45336a0f9ebf10
7ffab66a5a2a78de0d9c2e3855aa6e1b8a1885d22efd6b914906ad253c56d616
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
8169f1c80996bcbacc8733474b782be494a43f9fcc6e049554bd1e88818f81d6
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
875015f6d262d1a35165fa89db1c0cfa60e4c8964934c1523586c6b73a54ac50
87e1d6a1eede3e7ab13003b0aef9ca46485fd40ffccfef032fca73ad142e0e74
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
896e5d83ee1b9064b100e896d41174d656e6cd3dcf6bfddbee224d11abe84d49
8a1037b891212285bd46c6bb6d410d5f925cb070d6b40a0efdafddb36d26c0eb
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0
91ffef0e08af098862c5ee0b413103869650c929e0a65fbd29e5815e3b402609
93459448f77700adf95ec8e1c28d4be3f6e5980bcb8de09e7f45c13704338c23
959a6d8d7c97c22f7d01c2b239cf80c2bc97a3d0c8c8f4db167c97a4549d816d
95cf2ca8cb6cdba5cc7d928903181838546d6120525ebbf7bd0a221eb986f70b
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a02daf0d08caf745875d512497d9550f081c9c4145bf52adc8ade59e113b3069
a0611e486e87faf678d732cede5f2b94c26550f87a9e8baf6393ac3e8f96268b
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a3e244d62127c387d1fc002134fa39bc19254d9dc23e718741febe8205554f13
a4086c39edbec90f4f71d0c6f793e8b10331ed271f249e7d9f652509b6a0ff84
aa03dc59bdca72631d2301e4297cfa030bd31b907dc138e7b973d12311c90a22
aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
ab8bbbaf028510d8b119cce741f0c2cc94816dcc113d83cac81a6aade6a76fa9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
af0229418c42d613178908fba3b9c1b058fab24d9694426b011d46aecc782508
b031ac2de0397b38e928e3e3a15ac047a5f935c5238c849abf84edfae1f34176
b1cda027785ed80cd4d33b7f41b1bf9a67d8ef4812113cc01804041ac68b84b0
b2a27a31e9d34704f0c2adae8a77ce35e0bc3c352a40a682d89783142780c2f7
b55f0e65314298aa6644034ba593878fdaa54d2110c57c35857a46fa54361fab
b6258767d399255ae820aafbcc32919a70ba5bcb3a3e24e142a5ec1d65fa282d
b794fd23a82ba1c8cfc0b7495ed4218637dbeb175c84e22c818542dcd414f80e
b9313be10da5b66d758407a657afbb63ecb3889109579e2360b8d6ec47022777
ba040df724e8108d3b718525fa7d4081fca618c1d52fd3ac847a1ac8cf716a0a
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8
bf50c2e20a0d392c8869a2f047c7c2ecacbc67c27c7fb88e64cfeb5f3988b677
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
c09e9928aa285e1fcfc2dece1b02f5b8acc9492b15fe46fe61dfe125364d5c66
c1059373fb55a87ac98c82bdd1e03e08c17ffc03d619efc9597f1db49bc8b8d5
c670a9e8979d6b0470379251d189aad21d88e7c8cc84dbea372406ee686e3002
c71c456b8b74f5012aedb9b0116007e263b5bff4e181e9cd685bb8508cc01e1e
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813
c836e8ab799c688b37c2859736c124c94f454c530a13bc0edf533f38c0ec1836
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb
ca397f090cc73c01d9f4a9d39df24f6dc3e4d187a78d6167a40a32b961a34a0f
cb496b247c889c5000fd46f5db122068028d830d27c60305c21570ac3daef57c
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
cc21404b92f2dd70ad4050ca90e805bb4dfd8bf757dc4b978dc36e02230ae776
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d29049a4ef5dd2e01d52b60293ce4254a76dbadc08ebd3486124e96ddb1e7d10
d738772c0a424a490169895294555e3a43c3ba4a08e9a709c62ee6c391fe1091
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e85ba4d66717e8de5dcba1b5e0285ced20874b84f316ff3c0840277352b9c9ea
e89386e8282008db91f4835571a2b36b124b6295bc29a5aa274373c72942366e
ead2cb7bde057b6958215713b2b00fa14c3d7a0f56dada1001b7ce3fc1bcbe0c
eda2393686a684774ae90de15de274aebde04ab429882c6fed9404add2cb8702
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f210b9271768b879d492cc109b80efe874a3fe26d74ea0d46c072713e839b03d
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
f6c88d72ddbc86769c79cd60c2fbffac3679934dca3c2173dc8f919bcbbbfd64
f7125e9d8093f0f30262921eeecd071159a4737e7504a2d36f3f0672a9620ca8
f94e032d892cd03ec8d2e87a139d5598ff586ffd4ddccd14d0cef518730c0821